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

Sam*_*son 3 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>'
Run Code Online (Sandbox Code Playgroud)

下一个.

>> 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>'
Run Code Online (Sandbox Code Playgroud)

如果String.new不能,String()如何将Fixnum转换为String?我假设String()调用to_s.但是什么是String.new寻找除了要复制的字符串?是否为dup的别名?

sep*_*p2k 6

s(42)在您的示例中不起作用的原因是,有一个常量named String(指向该类)以及一个名为String(使用该参数将参数转换为字符串to_s)的方法.当你这样做时s = String,s现在将指向同一个类String.但是,当你调用时s(42),ruby会查找一个名为的方法s,该方法不存在而且你会收到错误.

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

String(42)和之间的不同行为的原因String.new(42)String呼叫to_sString.new呼叫to_str.