Search code examples
rubytranslateirbrails-i18n

Why word 'translate' is messing irb?


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.


Solution

  • 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.