我認爲這將是自然的事在Ruby中是這樣的:Ruby對象中是否有方法將自己傳遞給塊或過程?
class Object
def yield_self
yield(self)
end
end
是否任何機會存在的方法也是這樣嗎? (我還沒有找到。)其他人是否認爲這會很高興?
我認爲這將是自然的事在Ruby中是這樣的:Ruby對象中是否有方法將自己傳遞給塊或過程?
class Object
def yield_self
yield(self)
end
end
是否任何機會存在的方法也是這樣嗎? (我還沒有找到。)其他人是否認爲這會很高興?
yield_self
已經被添加到核心紅寶石一個月前的6月2017年https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/58528
它是用Ruby 2.5.0後版本號58528的,雖然我不完全知道如何獲得這些代碼呢。也許如果有人知道他們如何編輯這個答案
我不明白,爲什麼你想的複雜性:
Object.new.yield_self do |foo|
...
end
當以下幾乎是完全等價的:
foo = Object.new
...
要鏈方法調用。它對我來說看起來像是一個缺失的選擇。 – Alexey 2012-07-11 07:24:11
有確實是tap
方法做幾乎正是你請問:
x = [].tap do |array|
array << 'foo'
array << 9
end
p x
#=> ["foo", 9]
正如Rob Davis指出的那樣, tap
與您的方法之間的重要區別。 tap
的返回值是接收者(即我的例子中的匿名數組),而方法的返回值是該塊的返回值。
您可以在the source for the tap
method看到:
VALUE
rb_obj_tap(VALUE obj)
{
rb_yield(obj);
return obj;
}
我們返回已傳遞到函數,而不是rb_yield(obj)
返回值的obj
。如果這種區別至關重要,那麼tap
不是你所需要的。否則,它看起來很合適。
不,'tap'返回接收器,這是它的主要優點。在原始問題中,yield_self將返回yield的結果。這種差異不會在您的示例中顯示出來,因爲'tap'和該塊都會返回數組。 – 2012-07-11 00:30:43
@RobDavis你說得對。我已經更新了我的答案。 – Brandan 2012-07-11 01:10:29
謝謝,我知道水龍頭,但像yield_self這樣的方法對我來說看起來很自然,我想爲它做一個功能請求。它可以在方法鏈中使用。它也似乎是最近討論的一個方法的請求,它會返回'self':http://bugs.ruby-lang.org/issues/6373 – Alexey 2012-07-11 07:28:28
http://stackoverflow.com/questions/12848967/is-there-a-pipe-equivalent-in-ruby – tokland 2015-03-26 13:57:54