任意对象,类红宝石方法链接

问题描述 投票:2回答:5

我经常发现自己编写Ruby代码如下所示:

b = f1(a)
c = f2(b)
d = f3(c)
...

有没有一种方法,以链qazxsw POI,qazxsw POI,qazxsw POI一起不分类型A,B和C的?对于examplesomething像

f1

它并不需要准确地说,但我喜欢可以读取的代码,以便为“与f2开始,现在申请f3,然后应用a.send_to(&:f1) .sent_to(&:f2) .sent_to(&:f3) ,...”

它发生,我认为所有我真的问这里是一个单一的对象,而不是名单上使用a的方式。例如。我可以这样做:

f1

下面的(那种)的作品,虽然猴子修补f2似乎是一个坏主意:

map

我说:“(在某种程度上)的作品”,因为

[a].map(&:f1)
  .map(&:f2)
  .map(&:f3)
  .first

Object

注:class Object def send_to(&block) block.call(self) end end 问类似的东西,但建议是在特定类的每个对象的定义方法。

ruby chain
5个回答
5
投票

你可以做:

1.send_to{|x| x+1}
#=> 2

4
投票

我觉得基本上你想要的是注入和发送的组合。就像是:

def add_1(x); x+1; end  
1.send_to(&:add_1)
#=> NoMethodError: private method `add_1' called for 0:Fixnum

3
投票

如果你觉得这样做频繁的必要性,那么你的API设计是错误的Ruby代码。而不是定义函数风格的方法:

This question

在OOP风格定义它们:

d = [:f1, :f2, :f3].inject(a) { |res,f| send(f, res) }

在这里,d = [:f1, :f2, :f3].inject(a) {|memo, fun| send(fun, memo) } b = f1(a) c = f2(b) d = f3(c) ... 属于类,class A def f1; ... end # => b instance end class B def f2; ... end # => c instance end class C def f3; ... end # => d instance end A属于类,依此类推(aB,......不必将所有不同。如果你想允许他们可以bA任何对象)。然后,你可以简单地做链接为:

B

2
投票

红宝石2.5的Object正是这样做的! Kernel

如果我正确地遵循这个讨论,a.f1.f2.f3. ... 现在是.yield_self https://zverok.github.io/blog/2018-01-24-yield_self.html一个别名,请


0
投票

如果你开始.then功能,你不需要改变任何东西。 其次,省略括号能力是巨大的。

例如:

.yield_self

对于更复杂的功能,您可以添加括号。

© www.soinside.com 2019 - 2024. All rights reserved.