0

重複の可能性:
Ruby での #{ } の意味?

メタプログラミングに使用されていることは知っていますが、次の例でこの演算子が何をしているのかを理解するのに苦労しています:

class Class
 def attr_accessor_with_history(attr_name)
    attr_name = attr_name.to_s # make sure it's a string
    attr_reader attr_name
    attr_reader attr_name+"_history"
    class_eval %Q"
        def #{attr_name}=(value)
            if !defined? @#{attr_name}_history
                @#{attr_name}_history = [@#{attr_name}]
            end
            @#{attr_name} = value
            @#{attr_name}_history << value
        end
    "
    end
end

class Foo
   attr_accessor_with_history :bar
end
4

4 に答える 4

2

大まかに言えば、#{...}その中にあるものは何でも評価し、それを で文字列に変換して返しますto_s。これにより、複数のものを 1 つの文字列に結合することが非常に簡単になります。

典型的な例:

"There are #{n} car#{n == 1 ? '' : 's'} in the #{s}"

これは次と同等です。

"There are " + n.to_s + " car" + (n == 1 ? '' : 's').to_s + " in the " + s.to+_s

#{...}補間の内容は実際には Ruby コードのブロックであり、その結果は結合される前に文字列に変換されることを覚えておくことが重要です。

メタ プログラミングのその例は非常に怠惰でinstance_variable_getあり、instance_variable_set使用evalできた可能性があり、回避できた可能性があります。ほとんどの場合、メソッドやクラスではなく、文字列の作成に使用される文字列補間が表示されます。

String#%メソッドには、より堅牢なフォーマッタがあります。

"There are %d car%s in the %s" % [ n, (n == 1 ? '' : 's'), s ]

これを使用して、正確な小数点以下の桁数を追加したり、文字列にスペースを埋め込んだり、その他の便利なことを行うことができます。

于 2013-02-03T02:14:04.210 に答える
1

#{var}Ruby で変数置換を行います。例えば:

var = "Hello, my name is #{name}"

投稿したコードは、渡した attr_name のアクセサ メソッドのコードを含む文字列を生成しています。

于 2013-02-03T01:52:13.990 に答える
0

それが行うことはと呼ばれvariable interpolationます。

name = "Bond"
p "The name is #{name}. James #{name}."

出力します、

> "The name is Bond. James Bond."
于 2013-02-03T02:32:27.580 に答える
0

それは本当に多くのことをしていません:D. すべての赤いテキストは、基本的に単なる文字列です。"bla #{var} bla" の部分は、"bla " + var + " bla" をより適切に記述する方法です。irb で試してみてください:

a = 10
puts "The Joker stole #{a} pies." 
于 2013-02-03T01:52:24.870 に答える