當您定義一個方法時,它將返回一個與方法名稱相同的符號。這有什麼意義嗎?或者它只是作爲你創建它的驗證而存在?爲什麼方法定義返回符號?
像這樣:
def something
...
end
# => :something
當您定義一個方法時,它將返回一個與方法名稱相同的符號。這有什麼意義嗎?或者它只是作爲你創建它的驗證而存在?爲什麼方法定義返回符號?
像這樣:
def something
...
end
# => :something
IRB 總是顯示器上進行評估的最後一個表達式的值調用inspect
的結果。這個表達式是文字表達式,條件表達式,消息發送,類定義表達式還是方法定義表達式並不重要。
一切返回在Ruby中的值,即一切是一個表達式,有作爲Ruby的一份聲明中沒有這樣的事情。
過去,方法定義表達式的返回值是未定義的。大多數Ruby實現只是從方法定義表達式返回nil
,但Rubinius例如返回了定義方法的CompiledMethod
對象。
With Ruby 2.1,the return value of a method definition expression was standardized to be the Symbol
corresponding to the method's name。這允許您在方法中使用方法定義表達式作爲參數,這些方法需要方法的名稱作爲參數。
一些例子:
# Before Ruby 2.0:
def foo; end
private :foo
# After Ruby 2.0:
private def foo; end # similar for `protected`, `public`, `module_function`
# Before Ruby 2.0:
def map; end
alias_method :collect, :map
# After Ruby 2.0:
alias_method :collect, def map; end
就個人,我寧願方法定義表達,以評估對應於該方法的UnboundMethod
對象和方法等public
,private
,protected
,alias_method
,module_function
除Symbol
和String
之外,還應修改爲接受UnboundMethod
。
IRB
方面紅寶石標準「上次執行語句的結果從方法返回。」想象一下代碼:
def a
def b
# do stuff
end
end
什麼是執行這一結果碼?它如下:
a
# => :b
a.class
# => Symbol < Object
這就是說,IRB執行方法定義並返回/打印出它的結果。顯然,這是一個Symbol
實例。
的人誰proposed這個心中有一個用法是這樣的:
private def foo
...
end
protected def bar
...
end
方法,如public
,private
,protected
取符號作爲參數。關鍵是要使用這種語法。
所有方法在Ruby> = 2.1中定義返回符號(不僅僅是IRB中的符號)。
例如:
class Foo
p def bar; end
end
# => prints :bar
爲什麼這很有趣?
您可能已經注意到,有許多方法,特別是類級方法,它們將另一個方法的符號名稱作爲參數。您可能熟悉Rails控制器中的before_filter
。由於方法DEFS返回符號,你可能做到這一點:
class MyController < ApplicationController
before_filter def my_filter
# do stuff
end
end
我認爲它是2.1,而不是2.0 – sawa 2014-10-06 12:29:14
@sawa:你說得對:https://bugs.ruby-lang.org/issues/3753更新,謝謝 – 2014-10-06 12:32:05
我第一次與你的想法一致同意有關'UnboundMethod'對象!但後來,我想到了'ATTR _...'方法和'alias'關鍵字,它是在一個類似的靜脈,但不能被設計成採取'UnboundMethod'對象。如果這些方法有的採取'UnboundMethod'對象有的拿只有符號,這將是混亂總之,它看起來像符號是引用方法名稱最可靠的方法。 – sawa 2014-10-06 12:43:20