【问题标题】:What does String(42) do in Ruby?String(42) 在 Ruby 中做了什么?
【发布时间】:2011-02-04 02:28:39
【问题描述】:

为什么我不能这样做?

>> 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 还在寻找什么? new 是 dup 的别名吗?

【问题讨论】:

  • 你的两个问题没有任何关系。请把它们分成两个问题。

标签: ruby methods constants


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您只想要一个包含值“42”的字符串,那么您需要做的就是s = "42"

    如果您已经有一个要存储为字符串的 Fixnum,s = some_fixnum.to_s 会这样做。

    【讨论】:

    • 我很确定这只是一个学术问题。我认为(并希望)Danielson 先生通常遵循传统的""to_s 方法。
    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2013-10-08
    • 2011-01-24
    相关资源
    最近更新 更多