2013-01-08 46 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