2012-07-10 48 views
2

我認爲這將是自然的事在Ruby中是這樣的:Ruby對象中是否有方法將自己傳遞給塊或過程?

class Object 
    def yield_self 
    yield(self) 
    end 
end 

是否任何機會存在的方法也是這樣嗎? (我還沒有找到。)其他人是否認爲這會很高興?

+0

http://stackoverflow.com/questions/12848967/is-there-a-pipe-equivalent-in-ruby – tokland 2015-03-26 13:57:54

回答

1

我不明白,爲什麼你想的複雜性:

Object.new.yield_self do |foo| 
    ... 
end 

當以下幾乎是完全等價的:

foo = Object.new 
... 
+3

要鏈方法調用。它對我來說看起來像是一個缺失的選擇。 – Alexey 2012-07-11 07:24:11

2

有確實是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不是你所需要的。否則,它看起來很合適。

+2

不,'tap'返回接收器,這是它的主要優點。在原始問題中,yield_self將返回yield的結果。這種差異不會在您的示例中顯示出來,因爲'tap'和該塊都會返回數組。 – 2012-07-11 00:30:43

+0

@RobDavis你說得對。我已經更新了我的答案。 – Brandan 2012-07-11 01:10:29

+0

謝謝,我知道水龍頭,但像yield_self這樣的方法對我來說看起來很自然,我想爲它做一個功能請求。它可以在方法鏈中使用。它也似乎是最近討論的一個方法的請求,它會返回'self':http://bugs.ruby-lang.org/issues/6373 – Alexey 2012-07-11 07:28:28