Ruby 自定义方法链

eti*_*eti 5 ruby ruby-on-rails

将多个自定义方法链接在一起的最佳方式是什么?我想以一种优雅的方式将我的方法的输出直接放入下一个方法中。下面的第一个是我现在所拥有的。

verified = search_verified(@providers)
matching = search_matching(verified)
deactivated = search_deactivated(matching)
networks = search_networks(deactivated)
designations = search_designations(networks)
disorders = search_disorders(designations)
age_groups = search_age_groups(disorders)
governing = search_governing(age_groups)
search_availabilities(governing)
Run Code Online (Sandbox Code Playgroud)

也许更多的是:

search_verified(@providers) 
>> search_matching
>> search_deactivated
>> search_networks 
>> ....
Run Code Online (Sandbox Code Playgroud)

spi*_*ann 6

您可能希望使用then链接方法和数字参数来简化块:

search_verified(@providers)
  .then { search_matching(_1) }
  .then { search_deactivated(_1) }
  .then { search_networks(_1) }
  .then { search_designations(_1) }
  .then { search_disorders(_1) }
  .then { search_age_groups(_1) }
  .then { search_governing(_1) }
  .then { search_availabilities(_1) }
Run Code Online (Sandbox Code Playgroud)


3li*_*t0r 5

你可以按照这些思路做一些事情。Ruby 2.6.0 引入了then, 以及函数组合运算符<<和>>。

您确实必须选择方法,method(:method_name)因为method_name它本身会调用该方法并且不会返回它。

@providers.then(&
  method(:search_verified)     >>
  method(:search_matching)     >>
  method(:search_deactivated)  >>
  method(:search_networks)     >>
  method(:search_designations) >>
  method(:search_disorders)    >>
  method(:search_age_groups)   >>
  method(:search_governing)    >>
  method(:search_availabilities)
)
Run Code Online (Sandbox Code Playgroud)

如果你不喜欢“头顶”这个角色。method您可以通过首先将方法存储在较短的变量中来减少字符数:

fn = method(:method)

@providers.then(&
  fn[:search_verified] >>
  # ...
)
Run Code Online (Sandbox Code Playgroud)


小智 -2

这取决于您真正需要什么数据以及如何定义代码的架构,我通常创建一个Service 对象。

如果您只想返回最后一个方法的输出。return search_availabilities(governing)。

如果您需要所有变量,您可以让它返回一个包含所有变量或您需要的变量的数组。return [verified, matching, deactivated, ...]。