0

我经常在我正在编写的代码中定义方法及其反义词,例如:

def happy?
  @happiness > 3
end

def sad?
  !happy?
end

这很好,但我有点惊讶 Ruby 或 ActiveSupport 没有给我类似的东西:

def happy?
  @happiness > 3
end

alias_opposite :sad? :happy?

还是我只是找错地方了?

4

3 回答 3

3

我怀疑这种模式在 ruby​​ 中并不常见,因为unless关键字通常可以解决问题:

# ...
clap_your_hands if happy?
stomp_your_feet unless happy?
# ...

当然,自己动手也很简单:

module Antonymator
  def define_antonym(as, of)
    define_method(as.to_sym) do |*args|
      return !(send(of.to_sym, *args))
    end
  end
end

# Usage Example
class AreThey
  extend Antonymator
  define_antonym :uneql?, :eql?
  define_antonym :nonconsecutive?, :consecutive?
  def eql?(a, b)
    a == b
  end
  def consecutive?(a, b)
    a.next == b
  end
end

are_they = AreThey.new
puts are_they.uneql? 1, 2           # true
puts are_they.nonconsecutive? 1, 2  # false
于 2013-10-26T19:38:17.483 回答
3

流行的库中没有这样的方法,但是有如何实现的

class Module
  def alias_opposite(a, b)
    define_method(a) { !self.send(b) }
  end
end

用法

class A < Struct.new(:happiness)
  def happy?
    happiness > 3
  end

  alias_opposite :sad?, :happy?
end

p A.new(1).sad? # => true
p A.new(5).sad? # => false
于 2013-10-26T19:05:41.980 回答
0

如果您的方法返回布尔值,您始终可以在否定方法中包含肯定方法。

def drinking_age?(age)
  age > @restricted_age
end

def not_drinking_age?(age)
  !drinking_age?(age)
end

@restricted_age = 20

希望有帮助。

我想这取决于上下文中“相反”的含义。

于 2013-10-27T03:55:50.860 回答