为什么单词'翻译'弄乱了吗?

时间:2017-01-11 12:27:40

标签: ruby translate irb rails-i18n

我不明白为什么我的方法translate取消定义start_with?方法并且正在弄乱irb中的某些东西,所以我只能通过按 Ctrl + <退出irb kbd> d ,而不是exitquit

>> "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>'
>>  

我尝试了两个不同的工作区,效果是一样的。
我的Ruby和Rails版本是:

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

来自my other question我知道许多I18N图书馆使用了translate这个词,所以它是我唯一的嫌疑人,因此这个问题的标题。但作为初学者,我没有看到任何关系。

2 个答案:

答案 0 :(得分:2)

YARV中的一个错误是YARV 2.4.0中的fixed

如果您没有YARV 2.4.0,则提交消息会提及以下解决方法:

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

请注意,其他实施不受影响,只有YARV。

答案 1 :(得分:1)

这是一个理论

  • 您的设置中可能存在全局功能translate
  • irb打印输出
  • 时,使用指令序列作为参数调用此函数
  • 因此,当您重新定义translate打印输出中断

NoMethodError: undefined method并不意味着该方法已全局未定义,而是发送给不理解它的对象

您可以通过执行

来测试我的理论
method(:translate)

如果您收到结果,那么translate已经定义,您不能重新定义它!

现在,如果你想知道哪个gem定义了这个函数,请安装pry gem(这是一个更好的irb)并使用$命令来查看该方法的文件和源代码< / p>

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