8

Ruby が二重引用符 ( "")と で新しい文字列を初期化する方法の違いは何String.newですか? 好奇心と実験の目的で、私はオーバーライドしましたString#initialize:

class String
  def initialize
    puts "I <3 bananas" # they're delicious!
  end
end

私が理解しようとしているのは、これら 2 つの例が異なるのはなぜですか?

# Calling the String class directly, I can declare banana love!
irb(main):054:0> String.new
I <3 bananas
=> ""

# Using double quotes, this string is not as tasty :(
irb(main):055:0> ""
=> ""

Google の検索結果はすべて基本的な Ruby 構文に焦点を当てているように見え、Ruby のドキュメントには何も見つからないため、これを調査するのは面倒です。

4

1 に答える 1

10

マッツによると:

リテラルの文字列オブジェクトは、コンパイル時に既に作成されています。これは、initialize メソッドを再定義するずっと前のことです。リテラルの個々の文字列オブジェクトは、既に割り当てられて初期化されたオブジェクトの単なるコピーです。名前が示すように、initialize メソッドの全体的な目的は、新しく作成されたオブジェクトを初期化することです。コンパイル時にすでに初期化されている文字列リテラルの (再定義された) 初期化メソッドを呼び出す必要はないと思います。

于 2013-04-22T04:09:36.177 に答える