9

Pythonでは、次のことができます。

print "Hi!  I'm %(name)s, and I'm %(age)d years old." % ({"name":"Brian","age":30})

この動作を再現するための最も近く、最も単純なRubyイディオムは何ですか?(Stringクラスにモンキーパッチを適用しないでください。)

編集:これの本当に優れた利点の1つは、前処理された文字列を変数に格納し、次のように「テンプレート」として使用できることです。

template = "Hi!  I'm %(name)s, and I'm %(age)d years old."
def greet(template,name,age):
    print template % ({"name":name,"age":age})

これは明らかに些細な例ですが、後で使用するためにそのような文字列を保存できることには多くの有用性があります。Rubyの"Hi! I'm #{name}"規則は大まかに似ていますが、すぐに評価すると汎用性が低くなります。

#{var}この編集の前から来たので、テクニックを示唆する答えに反対票を投じないでください。(ランダムなアイデアカーネル:質問の作成者が回答を「時代遅れ」とマークした場合、おそらく回答を投票から保護する必要があります...?)

4

7 に答える 7

16

使用することもできます

printf "1: %<key1>s 2: %<key2>s\n", {:key1 => "value1", :key2 => "value2"}

また

data = {:key1 => "value1", :key2 => "value2"}
printf "1: %<key1>s 2: %<key2>s\n",  data

または(これにはruby 1.9が必要です。他の例についてはわかりません)

data = {key1: "value1", key2: "value2"}
printf "1: %<key1>s 2: %<key2>s\n", data

これは印刷します

1: value1 2: value2

重要な制限: 使用されるハッシュのキー (私の例ではdata ) はシンボルでなければなりません。


上記の例の注釈: printf1 つの書式文字列とオプションのパラメーターを取ります。しかし、方法もありString#%ます。

次の 4 つの呼び出しはすべて同じ結果になります。

printf "1: %<key1>s 2: %<key2>s\n" , {:key1 => "value1", :key2 => "value2"}
printf "1: %<key1>s 2: %<key2>s\n" % {:key1 => "value1", :key2 => "value2"}
print  "1: %<key1>s 2: %<key2>s\n" % {:key1 => "value1", :key2 => "value2"}
puts   "1: %<key1>s 2: %<key2>s"   % {:key1 => "value1", :key2 => "value2"}

2 番目のバージョンは、最初にString#%- メソッドを使用し、結果を に送信しprintfます。

于 2012-09-24T10:19:55.190 に答える
15

あなたはこのようにします:

values = {:hello => 'world', :world => 'hello'}
puts "%{world} %{hello}" % values

詳細については、こちらをお読みください: http://ruby.runpaint.org/strings#sprintf-hash

もっと洗練されたものが必要な場合は、ERB と google テンプレート エンジンについて読んでください。Web ページや電子メールなどを生成する必要がある場合は、テンプレート エンジンを使用する方がより堅牢なソリューションであることがわかります。

于 2012-10-23T09:53:41.590 に答える
6

Rubyではこれにいくつかの素晴らしいトリックがあります:

name = "Peter"
@age = 15 # instance variable
puts "Hi, you are #{name} and your age is #@age"
于 2008-10-13T06:34:09.293 に答える
3
 class Template

  def %(h)
    "Hi!  I'm #{h[:name]}s, and I'm #{h[:age]}d years old."


  end
end

次に、それを呼び出します

t=Template.new
t%({:name => "Peter", :age => 18})

これはまさにあなたが求めたものではありませんが、ヒントを与えることができます。

于 2008-10-13T19:47:39.537 に答える
2

Rubyの二重引用符で囲まれた文字列に、次のようなRuby式の結果を挿入できます。

puts "Hi!  I'm #{name}, and I'm #{age} years old."

中括弧の中に式を入れるだけです。(#{age + 5}、#{name +'' + last_name}、または関数呼び出しなど、より複雑なものにすることもできます。)

于 2008-10-13T06:31:22.217 に答える
2

ただし、(その間)機能するのは、次のようなものです。

d = {"key1" => "value1", "key2" => "value2"}
s = "string to be magically induced with variables, which are \n * %s and \n * %s.\n"
print s%d.values()
# or
print s%[d["key1"], d["key2"]]
于 2012-09-24T09:55:50.270 に答える
0

「こんにちは!私は#{name}で、#{age}歳です。」

于 2008-10-13T06:31:53.807 に答える