我经常发现自己编写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
问类似的东西,但建议是在特定类的每个对象的定义方法。
你可以做:
1.send_to{|x| x+1}
#=> 2
我觉得基本上你想要的是注入和发送的组合。就像是:
def add_1(x); x+1; end
1.send_to(&:add_1)
#=> NoMethodError: private method `add_1' called for 0:Fixnum
如果你觉得这样做频繁的必要性,那么你的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
属于类,依此类推(a
,B
,......不必将所有不同。如果你想允许他们可以b
或A
任何对象)。然后,你可以简单地做链接为:
B
红宝石2.5的Object
正是这样做的! Kernel
如果我正确地遵循这个讨论,a.f1.f2.f3. ...
现在是.yield_self
https://zverok.github.io/blog/2018-01-24-yield_self.html一个别名,请
如果你开始.then
功能,你不需要改变任何东西。
其次,省略括号能力是巨大的。
例如:
.yield_self
对于更复杂的功能,您可以添加括号。