2011-06-14 62 views
26

我對Ruby有點新鮮,仍然試圖理解一些語言設計原則。如果我已經明白了,Ruby中的lambda表達式調用必須使用方括號,而「常規」函數調用使用「常規」/圓括號。調用/應用lambda與函數調用 - Ruby中的語法不同。爲什麼?

是否有一個特殊的原因,語法不同?換句話說,(爲什麼)調用者應該知道他們是否調用函數或應用lambda表達式?

回答

23

因爲在Ruby中,方法不是lambda表達式(比如在JavaScript中)。方法總是屬於對象,可以被繼承(通過子類或混合類),可以在對象的特徵類中被覆蓋,並且可以被賦予一個塊(這是一個lambda)。他們有自己的變數範圍。示例方法的定義:

a = :some_variable 
def some_method 
    # do something, but not possible to access local variable a 
end 

# call with: 
some_method 

然而的lambda /特效的純關閉,可以被存儲在一個變量 - 沒有別的:

a = :some_variable 
some_lambda = lambda{ 
    # do something, access local variable a if you want to 
} 

# call with: 
some_lambda[] 

紅寶石結合了具有強大的語法接近,例如,通過塊:

def some_method_with_block(a) 
    # do something, call given block (which is a lambda) with: 
    yield(a) ? 42 : 21 
end 

# example call: 
some_method_with_block(1) do |x| 
    x.odd? 
end #=> 42 
+0

非常感謝!是的,JavaScript是我想到的一個反例。雖然我確實知道你的意思,但仍然覺得我可能從你的答案中學到更多東西:) – BreakPhreak 2011-06-14 13:34:24

+2

感謝您的反饋,添加了一些代碼片段:) – 2011-06-14 13:57:31

+0

完美!欣賞 - 瞭解更多,然後預計:) – BreakPhreak 2011-06-14 14:18:48

26

定期Ruby方法調用使用()不是用於塊的大括號。如果您不喜歡[]用於調用lambda,則始終可以使用call方法。

例子:

>> by_two = lambda { |x| x * 2 } #=> #<Proc:[email protected](irb):1> 
>> by_two[5] #=> 10 
>> by_two.call(5) #=> 10 

編輯

在還紅寶石的新版本:

>> by_two.(5) #=> 10 

至於爲什麼你不能只是做by_two(5),當紅寶石看到一個裸字它首先嚐試將其解析爲局部變量,如果失敗則爲方法。

+0

[1]修正了我的問題:'圓括號'而不是'捲曲'。我的錯。 [2]假設'by_two'首先被解析爲一個變量。這是否意味着其原因僅僅是技術性的(調整解析器)?這裏沒有任何一種可以出現在lambda調用或函數調用中的東西嗎?不是某種程度上反映在語言設計層面上的差異嗎? – BreakPhreak 2011-06-14 13:21:43

+0

請參閱下面的J-_- L的答案[2]。 – 2011-06-14 13:33:17

8

如果你想支架,你可以做

by_two = lambda { |x| x * 2 } 
by_two.(5) # => 10 

請注意by_two(5)之間的.

+0

這是有用的知道 – nterry 2014-02-04 21:49:06

相關問題