我正在編寫一個簡單的事件總線以在應用程序中使用。這部分工作正常:Kernel.lambda()不返回Ruby 1.9中的lambda Proc
#!/usr/bin/env ruby
module EventBus
@callbacks = {}
module_function
def on event, &callback
@callbacks[event] ||= []
@callbacks[event].push callback
end
def fire event, *data
@callbacks[event].each do |callback|
callback.call *data
end
end
end
EventBus.on :foo do |x| puts x end
EventBus.fire :foo, "test"
# => test
因爲我的程序的複雜性,而事實上,Proc
。就拿參數非常loosey-說傻話時尚的,我想要一些說法在我的事件檢查。 lambda
是這個明智的選擇:
EventBus.on :bar, &(lambda do |x| puts x end)
# Will raise an ArgumentError, since the event was fired without any arguments
# Remember that this is the desired behavior
EventBus.fire :bar
顯然,on
調用的語法是醜陋的,由於&(lambda do ... end)
。我寧願能夠使用do ... end
(即只是傳遞一個沒有統一的&符號運算符的普通塊)並將其轉換爲lambda。我嘗試了明顯的:
...
def on_lambda event, &callback
@callbacks[event] ||= []
@callbacks[event].push(lambda &callback)
# check if the added callback is lambda. (spoiler alert: it isn't)
puts @callbacks[event].last.lambda?
end
end
EventBus.on_lambda :baz do |x| puts x end
# I would expect the callback to be a lambda, and thus throw an ArgumentError,
# but neither of these holds.
EventBus.fire :baz
據我所知,on_lambda
需要一個塊時,它(通過&
)轉換成由callback
本地引用一個Proc
。我將lambda
與callback
的調用結果轉換回一個塊。我期望這會返回從callback
Proc
派生的lambda,所以我的問題是:爲什麼陣列上的元素是正常的Proc
。?
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
更新: 由
{ }
MEGAS的提提我看着
->() { }
語法提示(我已經看到它被稱爲「刺」運算符)。它從指定的塊中生成一個lambda。這可能與我想要的普通塊語法和參數檢查的混合程度差不多。所有我需要做的就是調整的
on
方法:但是
EventBus.on :bam, ->(x) do
puts x
end
我還是好奇,原來的問題,:
def on event, callback
@callbacks[event] ||= []
@callbacks[event].push callback
end
,然後附加回調像這樣。
什麼代碼約定使用{}針對一個行塊? – megas 2012-07-25 19:26:21
就我所知,除了優先級之外,它的作用與「do ... end」等效。回調函數在我的應用程序中幾乎不會是單行的,使用該語法也不會生成lambda Proc。 – bkconrad 2012-07-25 19:43:03