Что String (42) делает в Ruby? - PullRequest
3 голосов
/ 04 февраля 2011

Почему я не могу это сделать?

>> 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 () преобразует Fixnum в строку, если String.new не может?Я предполагаю, что String () вызывает to_s.Но что же ищет String.new, кроме строки для копирования?Новый псевдоним для dup?

Ответы [ 2 ]

6 голосов
/ 04 февраля 2011

Причина, по которой 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.

0 голосов
/ 04 февраля 2011

Если вам нужна строка со значением «42», то s = "42" - это все, что вам нужно сделать.

Если у вас уже есть Fixnum, который вы хотите сохранить в виде строки,s = some_fixnum.to_s сделает это.

...