簡體   English   中英

如何在 Ruby 中模擬 Python 的命名 printf 參數?

[英]How do I emulate Python's named printf parameters in Ruby?

在 Python 中,您可以這樣做:

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

復制這種行為的最接近、最簡單的 Ruby 習語是什么? (請不要對 String 類進行猴子修補。)

這樣做的真正好處之一是您可以將預處理的字符串存儲在變量中並將其用作“模板”,如下所示:

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}"約定大致相似,但直接評估使其不那么通用。

你也可以使用

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采用一個格式字符串和可選參數。 但也有一個String#% -方法。

以下四個調用具有相同的結果:

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

第二個版本首先使用String#% -方法並將結果發送到printf

你這樣做:

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

閱讀此內容以獲取更多信息: http ://ruby.runpaint.org/strings#sprintf-hash

如果您需要更復雜的東西,請閱讀 ERB 和 google 模板引擎。 如果您需要生成網頁、電子郵件等,您會發現使用模板引擎是一種更強大的解決方案。

在 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})

這不完全是您所要求的,但可以給您一個提示。

但是,有效的(同時)是以下方面的東西:

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

在 Ruby 中的雙引號字符串中,您可以插入 Ruby 表達式的結果,如下所示:

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

只需在花括號內放置一個表達式即可。 (也可以是更復雜的東西,比如#{age + 5},或#{name + ' ' + last_name},或函數調用。)

放“嗨!我是 #{name},我 #{age} 歲。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM