类方法,如哈希值
问题描述:
我有这方面的工作代码:类方法,如哈希值
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
这是不正确的代码,因为行动()方法调用中创建my_hash,但如果我尝试修改代码:
my_hash = { :on_filter => { action } }
我得到错误信息。
是否可以使用散列值的方法创建散列?
答
确定这是可能的,但不完全是方法(因为方法不是Ruby中的对象),而是使用Proc
对象。例如,看看this tutorial。
总之,你应该在你的Client#initialize
能够达到你想要的东西通过
my_hash = { :on_filter => Proc.new{action} }
。
答
当你想一个方法,在Ruby中,你必须调用... method
:-)
my_hash = { :on_filter => { method(:action) } }
请注意,您原来的代码也可以写成:
@server.handle(&method(:action))
这告诉它使用方法action
作为块参数(这就是为什么有&
)。相反,你传递一个块,所以是完全等价的,你现在可以通过一个块,而不是如果你喜欢的方法:
my_hash = { :on_filter => Proc.new{ action } }
方法肯定是对象,他们有一个全班他们!实际上,他们中的两个:Method,UnboundMethod。检查我的回答 – 2010-04-08 14:10:15
嗯,不知道这个:http://www.mentby.com/david-a-black/are-methods-objects.html但是你说得对,'method'方法也可以是有用的。 – 2010-04-08 15:04:51
他表示他们不是“头等客体”,无论如何。他可能有一个定义,但我不知道。 带'object_id'的参数只是显示方法不是立即数(如符号,true,...)。但是,浮动,字符串,Procs等都不是。 方法可以看作是一个绑定接收方的UnboundMethod。这并不能使他们成为一个客体。在Ruby中:'42.method(:to_s).is_a?(Object)#=> true' – 2010-04-08 16:35:11