我對Ruby有點新鮮,仍然試圖理解一些語言設計原則。如果我已經明白了,Ruby中的lambda表達式調用必須使用方括號,而「常規」函數調用使用「常規」/圓括號。調用/應用lambda與函數調用 - Ruby中的語法不同。爲什麼?
是否有一個特殊的原因,語法不同?換句話說,(爲什麼)調用者應該知道他們是否調用函數或應用lambda表達式?
我對Ruby有點新鮮,仍然試圖理解一些語言設計原則。如果我已經明白了,Ruby中的lambda表達式調用必須使用方括號,而「常規」函數調用使用「常規」/圓括號。調用/應用lambda與函數調用 - Ruby中的語法不同。爲什麼?
是否有一個特殊的原因,語法不同?換句話說,(爲什麼)調用者應該知道他們是否調用函數或應用lambda表達式?
因爲在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
定期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)
,當紅寶石看到一個裸字它首先嚐試將其解析爲局部變量,如果失敗則爲方法。
[1]修正了我的問題:'圓括號'而不是'捲曲'。我的錯。 [2]假設'by_two'首先被解析爲一個變量。這是否意味着其原因僅僅是技術性的(調整解析器)?這裏沒有任何一種可以出現在lambda調用或函數調用中的東西嗎?不是某種程度上反映在語言設計層面上的差異嗎? – BreakPhreak 2011-06-14 13:21:43
請參閱下面的J-_- L的答案[2]。 – 2011-06-14 13:33:17
如果你想支架,你可以做
by_two = lambda { |x| x * 2 }
by_two.(5) # => 10
請注意by_two
和(5)
之間的.
。
這是有用的知道 – nterry 2014-02-04 21:49:06
非常感謝!是的,JavaScript是我想到的一個反例。雖然我確實知道你的意思,但仍然覺得我可能從你的答案中學到更多東西:) – BreakPhreak 2011-06-14 13:34:24
感謝您的反饋,添加了一些代碼片段:) – 2011-06-14 13:57:31
完美!欣賞 - 瞭解更多,然後預計:) – BreakPhreak 2011-06-14 14:18:48