2010-04-08 94 views
2

我有這方面的工作代碼:類方法,如哈希值

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

我得到錯誤信息。

是否可以使用散列值的方法創建散列?

回答

0

確定這是可能的,但不完全是方法(因爲方法不是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

1

當你想一個方法,在Ruby中,你必須調用... method :-)

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

請注意,您原來的代碼也可以寫成:

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

這告訴它使用方法action作爲塊參數(這就是爲什麼有&)。相反,你傳遞一個塊,所以是完全等價的,你現在可以通過一個塊,而不是如果你喜歡的方法:

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