为什么我不能这样做?
>> s = String
>> s(42)
s(42)
NoMethodError: undefined method `s' for main:Object
from (irb):86
from /home/sam/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>'
下一步。
>> String.new 42
String.new 42
TypeError: can't convert Fixnum into String
from (irb):90:in `initialize'
from (irb):90:in `new'
from (irb):90
from /home/sam/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>'
如果String.new不能,String()如何将Fixnum转换为String?我假设String()调用to_s。但是什么是String.new寻找除了要复制的字符串?是否为dup的新别名?
答案 0 :(得分:6)
s(42)
在您的示例中不起作用的原因是,有一个名为String
的常量(指向该类)以及名为String
的方法(其中使用to_s
将参数转换为字符串。执行s = String
后,s
现在将指向与String
相同的班级。但是,当您调用s(42)
时,ruby将查找名为s
的方法,该方法不存在且您收到错误。
这里的关键是在ruby中可以有一个变量或常量以及一个具有相同名称的方法,而它们之间没有任何关系。
String(42)
和String.new(42)
之间行为不同的原因是String
调用to_s
和String.new
调用to_str
。
答案 1 :(得分:0)
如果您只想要一个值为“42”的字符串,那么您需要s = "42"
。
如果您已经将Fixnum存储为字符串,s = some_fixnum.to_s
将会执行此操作。