2017-01-11 2 views
2

Je ne comprends pas pourquoi ma méthode translate Annule la définition de la méthode et est déconner quelque chose dans RIR, donc je ne peux irb sortir en appuyant uniquement sur Ctrl + d, non exit ou quit:Pourquoi le mot «traduire» signifie-t-il déconner?

>> "hello".respond_to?(:start_with?) 
=> true 
>> def translate(string)                             
>> if string.start_with?("a", "e", "i", "o", "u") 
>>  string += "ay"                              
>> end 
>> end 
NoMethodError: undefined method `start_with?' for #<RubyVM::InstructionSequence:0x00000001d4c960> 
     from (irb):3:in `translate' 
     from /usr/local/rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>' 
>> "hello".respond_to?(:start_with?)                          
NoMethodError: undefined method `start_with?' for <RubyVM::InstructionSequence:[email protected](irb)>:RubyVM::InstructionSequence 
     from (irb):3:in `translate' 
     from /usr/local/rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>' 
>> exit 
NoMethodError: undefined method `start_with?' for <RubyVM::InstructionSequence:[email protected](irb)>:RubyVM::InstructionSequence 
     from (irb):3:in `translate' 
     from /usr/local/rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>' 
>> quit 
NoMethodError: undefined method `start_with?' for <RubyVM::InstructionSequence:[email protected](irb)>:RubyVM::InstructionSequence 
     from (irb):3:in `translate' 
     from /usr/local/rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>' 
>> 

I essayé deux espaces de travail différents et l'effet est le même.
Mes versions Ruby et Rails sont:

~/workspace $ ruby -v 
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux] 
~/workspace $ rails -v 
Rails 4.2.2 

de my other question Je sais que ce mot translate est utilisé par de nombreuses bibliothèques I18N, il est mon seul suspect, d'où le titre de cette question. Cependant en tant que débutant, je ne vois aucune relation.

+1

Votre méthode fonctionne bien pour moi dans irb. Voyez si l'une de vos librairies code/libs effectue des correctifs/raffinements de singe sur 'String'. – GolfWolf

+0

Vous dites que votre méthode 'translate' indéfinit' String # start_with? ', Mais il n'y a aucune indication de cela dans la transcription que vous avez montrée. Comment avez-vous déterminé que c'est effectivement ce qui se passe? –

+0

@ w0lf J'ai lu à propos de ce patch de singe. Honnêtement, je ne sais pas comment vérifier cela, mais si c'est à cause de quelques gemmes, j'ai installé seulement 'ruby',' rails', 'rspec' et' pry' sur un espace de travail cloud9 vide. @ JörgWMittag 'méthode non définie' start_with? ''Ce n'est pas ce que vous voulez dire? J'ai essayé 'puts String.methods' mais la sortie est toujours la même, peu importe ce que je tape. Je peux seulement ctrl + d et redémarrer irb.Je également remarqué sur frais irb: > def traduit (s) > s met > fin # =>: traduire J'ai vérifié RubyVM Ruby-doc, mais pour l'instant ce est une magie arcanique – ToTenMilan

Répondre

2

Il est un bug dans YARV qui était fixed dans YARV 2.4.0.

Le message de commit mentionne la solution de contournement suivante si vous n'avez pas YARV 2.4.0:

class << RubyVM::InstructionSequence 
    def translate; end 
    undef translate 
end 

Notez que d'autres mises en œuvre ne sont pas affectées, que YARV.

1

Voici une théorie

  • Il y a probablement une fonction globale translate dans votre configuration
  • Cette fonction est appelée avec une séquence d'instructions comme argument lorsque irb imprime la sortie
  • Par conséquent, lorsque vous redéfinissez translate l'impression des sauts de sortie

Le NoMethodError: undefined method ne signifie pas que la méthamphétamine od a été globalement non défini mais qu'il est envoyé à un objet qui ne comprend pas

Vous pouvez tester ma théorie en exécutant

method(:translate) 

Si vous obtenez un résultat à l'époque translate est déjà défini et votre ne doit pas le redéfinir!

Maintenant, si vous voulez savoir qui bijou défini cette fonction, installez bijou pry (ce qui est une meilleure RIR) et utiliser la commande $ pour regarder le fichier et le code source de cette méthode

# Use this command in pry to see location and source code 
$ translate