Why word 'translate' is messing irb?

試著忘記壹切 提交于 2019-12-18 09:07:10

问题


I don't understand why my method translate undefines start_with? method and is messing something in irb, so I can exit irb only by pressing Ctrl+d, not exit or quit:

>> "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:irb_binding@(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:irb_binding@(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:irb_binding@(irb)>:RubyVM::InstructionSequence
        from (irb):3:in `translate'
        from /usr/local/rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>'
>>  

I tried two different workspaces and effect is the same.
My Ruby and Rails versions are:

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

from my other question I know that word translate is used by many I18N libraries, so it's my only suspect, hence the title of this question. However as a beginner, I don't see any relation.


回答1:


It is a bug in YARV that was fixed in YARV 2.4.0.

The commit message mentions the following workaround if you don't have YARV 2.4.0:

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

Note that other implementations are not affected, only YARV.




回答2:


Here is a theory

  • There is probably a global function translate in your setup
  • This function is called with an instruction sequence as argument when irb prints the output
  • Hence when you redefine translate printing the output breaks

The NoMethodError: undefined method does not mean that the method has been undefined globally but that it is being sent to an object that does not understand it

You can test my theory by executing

method(:translate)

If you get a result back then translate is already defined and your must not redefine it!

Now if you want to know which gem defined this function, install pry gem (which is a better irb) and use the $ command to look at the file and source code of that method

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


来源:https://stackoverflow.com/questions/41590976/why-word-translate-is-messing-irb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!