stdlib_libraries/drb_remote_calls_no_parens.rb

tests/_examples/stdlib_libraries/drb_remote_calls_no_parens.rb in the metorex repository.

# A DRb server in one process answers method calls made from another. Values
# travel by Marshal, an undumpable object stays on the server and travels as
# a reference, a block runs back in the caller, and errors come back raised.
require "drb"
require "rbconfig"

class Counter
  include DRbUndumped

  def initialize
    @count = 0
  end

  def bump by = 1
    @count += by
  end

  attr_reader :count
end

class Front
  def add *numbers
    numbers.sum
  end

  def each_doubled list
    list.map { |value| yield value * 2 }
  end

  def counter
    @counter ||= Counter.new
  end

  def fail_here
    raise ArgumentError, "bad input"
  end

  def stop
    Thread.new do
      sleep 0.1
      DRb.stop_service
    end
    nil
  end

  private

  def hidden
    :secret
  end
end

if ARGV.first == "serve"
  DRb.start_service "druby://localhost:0", Front.new
  STDOUT.puts DRb.uri
  STDOUT.flush
  DRb.thread.join
  exit
end

IO.popen([RbConfig.ruby, __FILE__, "serve"]) do |server|
  DRb.start_service "druby://localhost:0"
  remote = DRbObject.new_with_uri server.gets.chomp
  p remote.add 1, 2, 3
  p(remote.each_doubled([1, 2]) { |value| value + 1 })
  counter = remote.counter
  p counter.class
  counter.bump 5
  p [counter.bump, remote.counter.count]
  begin
    remote.fail_here
  rescue ArgumentError => error
    p [error.class, error.message]
  end
  begin
    remote.hidden
  rescue NoMethodError => error
    p error.message.sub(/ for .*/, "")
  end
  remote.stop
  DRb.stop_service
end

Output:

6
[3, 5]
DRb::DRbObject
[6, 6]
[ArgumentError, "bad input"]
"private method 'hidden' called"