我有这个工作代码:
class Server
def handle(&block)
@block = block
end
def do
@block.call
end
end
class Client
def initialize
@server = Server.new
@server.handle { action }
end
def action
puts "some"
end
def call_server
@server.do
end
end
client = Client.new
client.call_server
我的服务器将处理多个操作,因此我想以这样的方式更改代码:
class Server
def handle(options)
@block = options[:on_filter]
end
def do
@block.call
end
end
class Client
def initialize
@server = Server.new
my_hash = { :on_filter => action }
@server.handle(my_hash)
end
def action
puts "some"
end
def call_server
@server.do
end
end
client = Client.new
client.call_server
这是错误的代码,因为action()方法调用create my_hash,但是如果我尝试将代码修改为:
my_hash = { :on_filter => { action } }
我收到错误消息。
是否可以使用方法作为哈希值创建哈希?
答案 0 :(得分:1)
如果你想要一个方法,在Ruby中,你必须调用... method
: - )
my_hash = { :on_filter => { method(:action) } }
请注意,原始代码可能已写入:
@server.handle(&method(:action))
这告诉它使用方法action
作为块参数(这就是为什么有&
)。相反,你传递了一个块,所以为了完全等效,你现在可以传递一个块而不是一个方法,如果你愿意:
my_hash = { :on_filter => Proc.new{ action } }
答案 1 :(得分:0)
当然可以,但不完全是方法(因为方法不是Ruby中的对象),而是使用Proc
个对象。例如,请查看this tutorial。
简而言之,你应该能够达到你想要的效果
my_hash = { :on_filter => Proc.new{action} }
在Client#initialize
。