2014-10-06 22 views
4

當您定義一個方法時,它將返回一個與方法名稱相同的符號。這有什麼意義嗎?或者它只是作爲你創建它的驗證而存在?爲什麼方法定義返回符號?

像這樣:

def something 
    ... 
end 
# => :something 

回答

8

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對象和方法等publicprivateprotectedalias_methodmodule_functionSymbolString之外,還應修改爲接受UnboundMethod

+2

我認爲它是2.1,而不是2.0 – sawa 2014-10-06 12:29:14

+0

@sawa:你說得對:https://bugs.ruby-lang.org/issues/3753更新,謝謝 – 2014-10-06 12:32:05

+0

我第一次與你的想法一致同意有關'UnboundMethod'對象!但後來,我想到了'ATTR _...'方法和'alias'關鍵字,它是在一個類似的靜脈,但不能被設計成採取'UnboundMethod'對象。如果這些方法有的採取'UnboundMethod'對象有的拿只有符號,這將是混亂總之,它看起來像符號是引用方法名稱最可靠的方法。 – sawa 2014-10-06 12:43:20

0

IRB方面紅寶石標準「上次執行語句的結果從方法返回。」想象一下代碼:

def a 
    def b 
    # do stuff 
    end 
end 

什麼是執行這一結果碼?它如下:

a 
# => :b 
a.class 
# => Symbol < Object 

這就是說,IRB執行方法定義並返回/打印出它的結果。顯然,這是一個Symbol實例。

4

的人誰proposed這個心中有一個用法是這樣的:

private def foo 
    ... 
end 
protected def bar 
    ... 
end 

方法,如publicprivateprotected取符號作爲參數。關鍵是要使用這種語法。

+0

這是記錄在任何地方嗎? – Stefan 2014-10-06 12:30:00

+1

@Stefan我在RDoc中找不到任何東西。他們應該寫這個。 – sawa 2014-10-06 12:34:59

+0

@sawa這句法不_beautiful_ ..此前一次是_beautiful_ .. :-( – 2014-10-06 13:13:53

2

所有方法在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 
+1

用'p'打印'puts'打印':bar' – Stefan 2014-10-06 12:21:18

+0

Thnx,已更新,以反映這種情況 – Jesper 2014-10-06 12:25:41