【发布时间】:2014-04-30 11:25:35
【问题描述】:
我想构建一个 API 客户端,其接口类似于 rails 活动记录。我希望消费者能够链接方法,并且在链接最后一个方法之后,客户端会根据调用的方法请求一个 url。所以它是带有一些惰性评估的方法链接。我查看了Active Record,但这非常复杂(产卵过程等)。
这是我正在谈论的那种事情的玩具示例。在调用“get”之前,您可以将任意数量的“bar”方法链接在一起,如下所示:
puts Foo.bar.bar.get # => 'bar,bar'
puts Foo.bar.bar.bar.get # => 'bar,bar,bar'
我已经成功实现了这一点,但我宁愿不需要调用“get”方法。所以我想要的是这样的:
puts Foo.bar.bar # => 'bar,bar'
但我目前的实现是这样的:
puts Foo.bar.bar #=> [:bar, :bar]
我曾考虑过覆盖 each 和 to_s 等数组方法,但我确信有更好的解决方案。
我如何链接这些方法并知道哪个是最后一个,以便我可以返回类似于get 方法中返回的字符串的内容?
这是我当前的实现:
#!/usr/bin/env ruby
class Bar
def get(args)
# does a request to an API and returns things but this will do for now.
args.join(',')
end
end
class Foo < Array
def self.bar
@q = new
@q << :bar
@q
end
def bar
self << :bar
self
end
def get
Bar.new.get(self)
end
end
【问题讨论】:
-
很想知道为什么使用
inject不会更简单。 -
@Denis - 在这种情况下显然会。然而,问题是如何编写支持延迟执行的方法链接的通用类。这个类的作用在这里并不重要。
-
这里已关闭,因为不清楚我在问什么,但我有一个正确的答案。
标签: ruby lazy-evaluation method-chaining