我有時候會用這個,如果我想給某個變量賦值,但是我必須先計算出我想賦值的值。它使代碼更加整潔。我認爲這是用戶偏好。基本上你在說:我正在分配一些東西給foo,但爲了獲得我想要的價值,我首先需要做一些事情。做記憶化的時候,所以不是
if @cache.nil?
do_something!
@cache = read_value
end
這是特別有用,你可以做
@cache ||= begin
do_something!
read_value
end
什麼你在這裏利用的是Ruby解釋器具有堆疊,每個表情通常會在推動東西堆棧,或從堆棧中取出一些東西。賦值只是從棧中取出最後一個東西並賦值(在這種情況下,最後一行從開始/結束)。很多時候知道這一點(Ruby中的堆棧方法)可能很有用。
我不認爲這違反了至少驚喜,但我認爲這是用戶偏好,你想使用它或不使用它。
你可以看到,它不看它生成的Ruby MRI 1.9什麼字節碼指令做什麼意外:
RubyVM::InstructionSequence::compile("c = begin; a = 5; 6; end").to_a
[:trace, 1],
[:trace, 1],
[:putobject, 5],
[:setlocal, 2],
[:trace, 1],
[:putobject, 6],
[:dup],
[:setlocal, 3],
[:leave]
跟蹤僅僅是堆棧跟蹤,你可以忽略。 Dup複製堆棧中的最後一個項目。在本例中,本地變量a
的編號爲2
,局部變量c
的編號爲3
(因此putobject, 2
將分配給變量a
等)。 與a = 5; c = 6
相比,唯一的副作用是dup
指令,這意味着您的方法的堆棧大小將增加1個時隙。但這並不是特別重要,因爲它只在解釋器位於這個特定方法內時才起作用,並且堆棧的內存是預先保留的,所以它只意味着堆棧指針會比其他方式減少1。所以基本上沒有改變。隨着優化打開,即使dup
可能會消失。
我從來沒有見過這樣的代碼。你能指出一個公共的源文件嗎? –
@SergioTulentsev:直到我能找到一個源文件,這裏有一個博客評論:http://blog.rubybestpractices.com/posts/rklemme/003-The_Universe_between_begin_and_end。html#comment-9011441 – pje
我不知道它會如何危險,但是IMO錯了:它應該是一種方法。 –