2013-01-08 52 views
3

可能重複:
Is there a `pipe` equivalent in ruby?紅寶石方法鏈 - `tap`與更換

我在紅寶石看tap方法 - 可惜對象從傳遞塊返回不會傳遞。我用什麼方法讓對象傳遞?

這裏就是我想要(失敗)做:

obj.tap{ |o| first_transform(o) }.tap{ |o| second_transform(o)} 

這是當然,相當於second_transform(first_transform(o))的。我只是問如何以第一種方式做到這一點。

這樣做是瑣碎的列表:

list.map{ |item| first_transform(item) }.map{ |item| second_transform(item)} 

爲什麼不是與對象上一樣容易?

+1

爲什麼不成功?怎麼了? –

+0

'tap'忽略/放棄從'first_transform'和'second_transform'方法返回的值。它的目的是在鏈條內部觀察物體,而不是參與鏈條本身。這隻有在'transform'方法改變對象本身時才起作用。 –

+2

「當然,這相當於'second_transform(first_transform(o))'」。不,它不等於'first_transform(o); second_transform(O);'。 –

回答

2
class Object 
    def as 
    yield self 
    end 
end 

有了這個,你可以做[1,2,3].as{|l| l << 4}.as{|l| l << 5}

+0

嗯。爲什麼這不是Ruby核心?這並不複雜,它非常有用。 –

+0

這就是爲什麼我在等待命名空間。更容易在班級內進行monkeypatch。 –

+4

請儘量避免使用關鍵字作爲方法名,儘管 –

-1

你也可以考慮做#first_transform#second_transform項目的類的實例方法(和返回過程中的轉化項目)。

這些方法的定義應該是這樣的:

class ItemClass 
    # If you want your method to modify the object you should 
    # add a bang at the end of the method name: first_transform! 
    def first_transform 
    # ... Manipulate the item (self) then return it 
    transformed_item 
    end 
end 

這種方式,你可以簡單地鏈上的方法調用的方法是這樣的:

list.map {|item| item.first_transform.second_transform } 

它甚至讀取我的愚見更好;)

+0

是的,這樣做,但我不想改變類 - 當它們是標準的Ruby對象/哈希/列表時更是如此。 –

+0

你不需要改變標準的數組/散列,你必須改變你的物品的類。我假設這些項目是你的一類,因爲通常在ruby標準類中方法是可鏈接的(例如''string'.upcase.reverse') –

+0

這正是問題 - 像'upcase'和'reverse'這樣的標準轉換是可鏈接的。自定義轉換怎麼樣?你如何使它們可鏈接? –

-1

簡單的答案是tap不會做你認爲它的作用。

tap在一個對象上被調用並且總會返回同一個對象。

由於tap個簡單的例子,使用

"foo".tap do |foo| 
    bar(foo) 
end 

這仍然返回"foo"

在你的榜樣,你有一個對象,並且要應用兩種功能於它在繼承。

second_transform(first_transform(obj)) 


更新:

所以我想我會問你爲什麼要以這種方式鏈。

obj.do{|o| first_transform(o)}.do{|o| second_transform(o)} 

是不是真的更清晰比

second_transform(first_transform(obj)) 

讓我們舉一個例子,我經常使用

markdown(truncate(@post.content)) 

truncated_post = truncate(@post.content) 
markdown(truncated_post) 

我想這取決於性質你的transform

+1

我很抱歉迂腐,但這看起來像是一個簡單的問題本身的重述: -/ –

+0

@SudhirJonathan事實上,這只是一個重申,但確實是你的問題措辭嚴重,所以需要重申。 – sawa