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