Pythonの名前付きprintfパラメーターをRubyでエミュレートするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/196841

  •  10-07-2019
  •  | 
  •  

質問

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

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

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

編集:この非常に優れた利点の1つは、前処理された文字列を変数に保存し、次のように" template"として使用できることです:

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!私は#{name}" の慣習は大まかに似ていますが、すぐに評価すると汎用性が低くなります。

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

役に立ちましたか?

解決

使用することもできます

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 )は記号でなければなりません。


上記の例に関する注釈: printf は、1つのフォーマット文字列とオプションのパラメーターを取ります。しかし、 String#% -methodもあります。

次の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#% -methodを使用し、結果を printf に送信します。

他のヒント

次のようにします:

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

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

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

Rubyには、これにいいトリックがあります:

name = "Peter"
@age = 15 # instance variable
puts "Hi, you are #{name} and your age is #@age"
 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})

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

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

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

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

(一方)動作するのは、次の行に沿ったものです:

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"]]

puts&quot;こんにちは!私は#{name}で、#{age}歳です。&quot;

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top