覆盖类似的方法,缩短语法

时间:2017-01-20 17:32:42

标签: ruby

在Ruby类中,我覆盖了三种方法,并且在每种方法中,我基本上都做同样的事情:

class ExampleClass

  def confirmation_required?
    is_allowed && super
  end

  def postpone_email_change?
    is_allowed && super
  end

  def reconfirmation_required?
    is_allowed && super
  end

end

是否有更紧凑的语法?如何缩短代码?

3 个答案:

答案 0 :(得分:8)

如何使用别名?

class ExampleClass

  def confirmation_required?
    is_allowed && super
  end

  alias postpone_email_change? confirmation_required?
  alias reconfirmation_required? confirmation_required?
end

答案 1 :(得分:1)

class ExampleClass
  %i|confirmation_required?
     postpone_email_change?
     reconfirmation_required?|.each do |m|

    define_method m do |*args, &cb|
      is_allowed && super(*args, &cb)
    end
  end
end

注意: %i|symbol1 symbol2|[:symbol1, :symbol2]的快捷方式 - 用于从单词创建符号列表的是ruby 2.0+语法。

答案 2 :(得分:0)

eval方法。考虑到代码气味,但在这种情况下具有更好的可读性。对于团队中缺乏经验的人来说也更容易理解。

class ExampleClass
  WRAPPED_METHODS = %i(
    confirmation_required?
    postpone_email_change?
    reconfirmation_required?
  )

  WRAPPED_METHODS.each do |method_name|
    class_eval("
      def #{method_name}
        is_allowed && super
      end
    ")
  end
end