ruby - String(42) 在 Ruby 中有什么作用?

标签 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() 调用 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/

相关文章:

c++ - 我真的需要为 const 对象实现用户提供的构造函数吗?

c - 使用 volatile 字符串作为 printf() 的格式字符串

ruby - 如何测试生成文件的脚本

ruby-on-rails - 如何测试 (ActiveRecord) 对象是否相等

html - 如何将 View 中的脚本移动到 Ruby On Rails 中的单独 js 文件?

java - 如何为类型类的数组编写 'get/set method'?

ruby - 如何替换数组的元素?

java - 在方法内实例化两个对象用作 'return values'

java - 如何调试为什么Java消息输出总是为空?

C++:对临时的常量引用