【发布时间】:2017-05-26 05:59:45
【问题描述】:
我不明白为什么我的方法 translate 取消定义 start_with? 方法并且在 irb 中弄乱了一些东西,所以我只能通过按 Ctrl+d退出 irb >,不是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 我知道translate 这个词被许多I18N 库使用,所以这是我唯一的嫌疑人,因此是这个问题的标题。但是作为初学者,我看不到任何关系。
【问题讨论】:
-
你的方法在 irb 中对我很有效。查看您的任何代码/库是否对
String进行了猴子修补/改进。 -
您说您的
translate方法未定义String#start_with?,但在您显示的成绩单中没有表明这一点。您如何确定这确实是正在发生的事情? -
@w0lf 我读到了这个猴子补丁。老实说,我不知道如何检查这一点,但如果是因为某些 gem,我只在空白的 cloud9 工作区上安装了
ruby、rails、rspec和pry。 @JörgWMittagundefined methodstart_with?'`这不是你的意思吗?我试过puts String.methods,但无论我输入什么,输出总是一样的。我只能 ctrl+d 并重新启动 irb。我还在新鲜的 irb 上注意到了这一点:> def translate(s) > puts s > end #<:instructionsequence:0x00000000a9a2e0> => :translate 我在 Ruby-doc 中检查了 RubyVM,但现在这是一些神秘的魔法
标签: ruby translate irb rails-i18n