String(42)在Ruby中做了什么?

时间:2011-02-04 02:28:39

标签: ruby methods constants

为什么我不能这样做?

>> 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的新别名?

2 个答案:

答案 0 :(得分:6)

s(42)在您的示例中不起作用的原因是,有一个名为String的常量(指向该类)以及名为String的方法(其中使用to_s将参数转换为字符串。执行s = String后,s现在将指向与String相同的班级。但是,当您调用s(42)时,ruby将查找名为s的方法,该方法不存在且您收到错误。

这里的关键是在ruby中可以有一个变量或常量以及一个具有相同名称的方法,而它们之间没有任何关系。

String(42)String.new(42)之间行为不同的原因是String调用to_sString.new调用to_str

答案 1 :(得分:0)

如果您只想要一个值为“42”的字符串,那么您需要s = "42"

如果您已经将Fixnum存储为字符串,s = some_fixnum.to_s将会执行此操作。