类方法,如哈希值

问题描述:

我有这方面的工作代码:类方法,如哈希值

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} } 

+0

方法肯定是对象,他们有一个全班他们!实际上,他们中的两个:Method,UnboundMethod。检查我的回答 – 2010-04-08 14:10:15

+0

嗯,不知道这个:http://www.mentby.com/david-a-black/are-methods-objects.html但是你说得对,'method'方法也可以是有用的。 – 2010-04-08 15:04:51

+0

他表示他们不是“头等客体”,无论如何。他可能有一个定义,但我不知道。 带'object_id'的参数只是显示方法不是立即数(如符号,true,...)。但是,浮动,字符串,Procs等都不是。 方法可以看作是一个绑定接收方的UnboundMethod。这并不能使他们成为一个客体。在Ruby中:'42.method(:to_s).is_a?(Object)#=> true' – 2010-04-08 16:35:11

当你想一个方法,在Ruby中,你必须调用... method :-)

my_hash = { :on_filter => { method(:action) } } 

请注意,您原来的代码也可以写成:

@server.handle(&method(:action)) 

这告诉它使用方法action作为块参数(这就是为什么有&)。相反,你传递一个块,所以是完全等价的,你现在可以通过一个块,而不是如果你喜欢的方法:

my_hash = { :on_filter => Proc.new{ action } }