我经常在我正在编写的代码中定义方法及其反义词,例如:
def happy?
@happiness > 3
end
def sad?
!happy?
end
这很好,但我有点惊讶 Ruby 或 ActiveSupport 没有给我类似的东西:
def happy?
@happiness > 3
end
alias_opposite :sad? :happy?
还是我只是找错地方了?
我经常在我正在编写的代码中定义方法及其反义词,例如:
def happy?
@happiness > 3
end
def sad?
!happy?
end
这很好,但我有点惊讶 Ruby 或 ActiveSupport 没有给我类似的东西:
def happy?
@happiness > 3
end
alias_opposite :sad? :happy?
还是我只是找错地方了?
我怀疑这种模式在 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
流行的库中没有这样的方法,但是有如何实现的
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
如果您的方法返回布尔值,您始终可以在否定方法中包含肯定方法。
def drinking_age?(age)
age > @restricted_age
end
def not_drinking_age?(age)
!drinking_age?(age)
end
@restricted_age = 20
希望有帮助。
我想这取决于上下文中“相反”的含义。