我敢確定常方法及其反義詞在我寫的代碼,如:如何在Ruby/Rails中清晰地定義「反義」或「相反」的方法?
def happy?
@happiness > 3
end
def sad?
!happy?
end
這很好,但我有點驚訝的是,Ruby或的ActiveSupport不給我像這樣:
def happy?
@happiness > 3
end
alias_opposite :sad? :happy?
或者我只是看錯了地方?
我敢確定常方法及其反義詞在我寫的代碼,如:如何在Ruby/Rails中清晰地定義「反義」或「相反」的方法?
def happy?
@happiness > 3
end
def sad?
!happy?
end
這很好,但我有點驚訝的是,Ruby或的ActiveSupport不給我像這樣:
def happy?
@happiness > 3
end
alias_opposite :sad? :happy?
或者我只是看錯了地方?
有一個在流行的庫沒有這樣的方法,但如何實現這一點的
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
我懷疑這種模式是不常見的紅寶石,因爲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
糟糕,只有在我發佈我的代碼後纔看到前面的答案,但是我會將它保留在此處,因爲它顯示瞭如何使用您自己的模塊而不是monkeypatching'Module'和b)處理方法參數。 – exbinary
如果你的方法返回一個布爾值,你總是可以在負方法中包含正值方法。
def drinking_age?(age)
age > @restricted_age
end
def not_drinking_age?(age)
!drinking_age?(age)
end
@restricted_age = 20
希望有所幫助。
我想這取決於上下文中「相反」的含義。
可能更好地定義一個單獨的模塊並擴展它,而不是污染'Module'。 – exbinary
這可能會引發'alias_opposite'鏈接。試着讓你的頭在附近。 –
@exbinary你一般會說得對,但我認爲我提到'ActiveSupport'這個事實可能有理由給一個猴子修補的例子,因爲AS似乎喜歡這樣做。 – ucarion