为什么我不能这样做?
>> 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() 调用 to_s。但是除了要复制的字符串之外,String.new 还在寻找什么? new 是 dup 的别名吗?
最佳答案
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
。
关于ruby - String(42) 在 Ruby 中有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4893975/