同一个实例的几种方法 - DRY

use*_*830 3 ruby ruby-on-rails dry

对不起,如果这太简单了.我正在寻找一种让我的ruby代码变干的方法:我想在同一个实例变量上调用多个方法@var = Model.new(param):

@var.method1
@var.method2
@var.method3
...
Run Code Online (Sandbox Code Playgroud)

是否可以使用该send方法编写一行代码?顺便说一下,是否可以调用块Model.new来生成更简洁的代码?

Uri*_*ssi 6

我相信DRY应该用于使您的代码更易于维护,更具可读性.我认为它应该被用来缩短您键入的字符数,或炫耀你的代码杂技.

在一个上下文中,@ Arup和@ p11y的解决方案都很棒,但作为一般规则(在了解您的课程或方法之前),我相信写作

@var.method1
@var.method2
@var.method3
Run Code Online (Sandbox Code Playgroud)

比写作更具可读性和可维护性

%i[method1 method2 method3].each(&@var.method(:send)) 
Run Code Online (Sandbox Code Playgroud)

(你需要精通高级红宝石才能理解这一点)

要么

@var.method1
    .method2
    .method3
Run Code Online (Sandbox Code Playgroud)

(再一次,消失的行为让未来的读者更加困惑而不是有帮助)

始终考虑谁将在6个月内阅读您的代码,以及最清楚的方式让他了解正在发生的事情.


Pat*_*ity 5

如果你构建method1,method2等等,他们使用它们返回实例本身self,你可以构建一个可链接的接口.例如:

class Foo
  def method1
    # do something
    self
  end

  def method2
    # do something
    self
  end

  def method3
    # do something
    self
  end

  # more methods...
end

@var = Foo.new

@var.method1.method2.method3

# or if this gets too long

@var.method1
    .method2
    .method3
Run Code Online (Sandbox Code Playgroud)