我不明白为什么我的方法translate
取消定义start_with?
方法并且正在弄乱irb中的某些东西,所以我只能通过按 Ctrl + <退出irb kbd> d ,而不是exit
或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>'
>>
我尝试了两个不同的工作区,效果是一样的。
我的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
这个词,所以它是我唯一的嫌疑人,因此这个问题的标题。但作为初学者,我没有看到任何关系。
答案 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