Méthode non définie '& gt;' pour néant: NilClass & lt; NoMethodError & gt;
Ok j'ai le code suivant
def update_state_actions
states.each do |state|
@state_turns[state.id] -= 1 if @state_turns[state.id] > 0 && state.auto_removal_timing == 1
end
end
maintenant dans la ligne de...
@state_turns[state.id] -= 1 if @state_turns[state.id] > 0 && state.auto_removal_timing == 1
il dit que l'erreur
in 'block update_state_actions' : Undefined method '>' for nil:NilClass <NoMethodError>
quelle est la cause de l'erreur? comment se >
est considérée comme une méthode, mais elle est un opérateur logique?
source d'informationauteur Mp de la Vega
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de problème avec ça. En Ruby, lorsque vous écrivez une expression comme
1 + 2
à l'interne, il est entendu que1.+( 2 )
: l'Appel d'une méthode#+
sur le récepteur1
avec2
comme un seul argument. Une autre façon de comprendre la même chose est, que vous envoyez le message[ :+, 2 ]
à l'objet1
.Maintenant, dans votre cas,
@state_turns[ state.id ]
retournenil
pour une raison quelconque. Donc l'expression@state_turns[state.id] > 0
devientnil > 0
qui, comme je l'ai dit plus tôt, il est entendu que l'appel à la#>
méthode surnil
. Mais vous pouvez vérifier queNilClass
à quinil
appartient, n'a pas de méthode d'instance#>
définie sur elle:La
NoMethodError
exception est donc légitime d'erreur. Par l'élévation de cette erreur, Ruby vous protège: Il vous dit au début que votre@state_turns[ state.id ]
n'est pas ce que vous supposez qu'il soit. De cette façon, vous pouvez corriger vos erreurs plus tôt et être plus efficace programmeur. Aussi, Ruby exceptions peuvent être sauvées avecbegin ... rescue ... end
déclaration. Ruby exceptions sont généralement très sympathiques et des objets utiles, et vous devez apprendre à définir votre personnalisé exceptions dans vos projets de logiciel.De prolonger cette discussion un peu plus, nous allons regarder de l'endroit où votre erreur est à venir. Lorsque vous écrivez une expression comme
nil > 10
qui est en faitnil.>( 10 )
Ruby commence la recherche d'#>
méthode dans la recherche de la chaîne denil
. Vous pouvez voir la chaîne de recherche en tapant:La méthode sera recherché dans chaque module de l'ancêtre de la chaîne: d'Abord, Ruby va vérifier si
#>
est défini surNilClass
puis surObject
puisKernel
et enfin,BasicObject
. Si#>
n'est pas trouvé dans l'un d'eux, Ruby va continuer en essayantmethod_missing
méthodes, de nouveau dans l'ordre sur tous les modules de la chaîne de recherche. Même simethod_missing
ne gère pas la:>
message,NoMethodError
exception sera levée. Pour le démontrer, nous allons définir#method_missing
méthode dansObject
par l'insertion d'un message personnalisé, qui apparaîtra à la place deNoMethodError
:Il n'y a pas une telle exception en Ruby. Vérifiez le Ruby
Exception
classe.Il doit être converti en entier variable pour effectuer le opercio: