2012-04-11 14 views
0

ルビにモジュールを書き込もうとしていて、比較演算子を使用するときは上記のエラーが出ます。いずれの演算子も動作しません。未定義メソッド `> = 'for nil:NilClass(NoMethodError)

if self.health >= opponent.health 
     [:attack, opponent] 
    else 
     [:rest] 
    end 

私が何らかの間違いをしている場合は教えてください。

ありがとうございます!

+1

本当に 'self.health'は' nil'ではないのですか?それはエラーメッセージが主張するものなので...(おそらくコードのどこかのタイプミスですか?) – user1252434

答えて

1

>=は、Comparableオブジェクトでのみ使用できます。エラーメッセージは、self.healthnilであることを示しています。 とopponent.healthの両方に対応するComparableオブジェクトが必要です。さらに、その間に比較が定義されている必要があります。

+0

'Comparable'は'> = ' - Enumerable'を実装していません。 http://ruby-doc.org/core-1.8.6/Comparable.html – thomthom

+0

@thomthom私の間違いを訂正してくれてありがとう。それを私が直した。 – sawa

+0

メソッド '> ='はどのクラスにも追加することができ、比較の際に使用されます。また、エラーテキストには、要求されたメソッドが含まれていないオブジェクトのクラス(この場合はNilClass)が含まれていますが、これは合理的に比較できないものです。 ;) – user1252434

0

@sawaが言ったように、あなたは例外を比較を高めている理由はself.healthがとしての@ user1252434で述べたものの法>=は(定義されていないためnil、ということである、Comparable説明は全く正しくありません。方法>=はモジュールComparableの有無に関わらず、任意のクラスで定義することができます。比較対象に応じて、このタイプの比較にデフォルト値を使用するのは簡単かもしれません。 Stringオブジェクトの場合、あなたは比較のためのデフォルトとして""(空の文字列)を使用するto_sを呼び出すことができます。

self.health.to_s >= opponent.health.to_s 
#Compares "" >= "" if the attributes are nil 

Fixnumかのオブジェクト(整数)の場合は、デフォルトとして0使用するto_iを使用することができます。

self.health.to_i >= opponent.health.to_i 
#Compares 0 >= 0 if the attributes are nil 

フロートオブジェクトに対して、デフォルトとして0.0使用するto_fを使用することができます。

self.health.to_f >= opponent.health.to_f 
#Compares 0.0 >= 0.0 if the attributes are nil 
関連する問題