2013-10-26 66 views

回答

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 
+0

可能更好地定義一個單獨的模塊並擴展它,而不是污染'Module'。 – exbinary

+0

這可能會引發'alias_opposite'鏈接。試着讓你的頭在附近。 –

+0

@exbinary你一般會說得對,但我認爲我提到'ActiveSupport'這個事實可能有理由給一個猴子修補的例子,因爲AS似乎喜歡這樣做。 – ucarion

3

我懷疑這種模式是不常見的紅寶石,因爲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 
+0

糟糕,只有在我發佈我的代碼後纔看到前面的答案,但是我會將它保留在此處,因爲它顯示瞭如何使用您自己的模塊而不是monkeypatching'Module'和b)處理方法參數。 – exbinary

0

如果你的方法返回一個布爾值,你總是可以在負方法中包含正值方法。

def drinking_age?(age) 
    age > @restricted_age 
end 

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

@restricted_age = 20 

希望有所幫助。

我想這取決於上下文中「相反」的含義。