2008-10-13 18 views
9

在Python中,你可以這樣做:如何在Ruby中模擬Python的named printf參數?

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

什麼是最接近的,最簡單的紅寶石成語來複制這種行爲? (否的Monkeypatching 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}"約定是非常相似的,但立即評估使其不那麼靈活。

請不要downvote建議#{var}技術的答案,因爲它們來自此編輯之前。 (隨機想法內核:如果問題作者將它們標記爲「過時」,可能應該從投票中得到答案...)

回答

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 

或(這需要紅寶石1.9,對於其他例子我不確定)

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

這將打印

1: value1 2: value2 

重要的限制:哈希(數據在我的例子)的使用的密鑰必須是符號。


以上示例的註記: 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

2

在Ruby中的雙引號字符串中,可以插入Ruby表達式的結果,如這個:

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

只是在花括號裏面放一個表達式。 (它也可能是像#{age + 5}或#{name +''+ last_name}或函數調用那樣更復雜的東西。)

0

puts「Hi!I'm#{name},and我##年齡}歲。「

6

有一些不錯的技巧,這在Ruby中:

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

這不正是你問什麼,但可以給你一個提示調用它。

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

你做這樣的:

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

閱讀更多信息: http://ruby.runpaint.org/strings#sprintf-hash

如果你需要一些更復雜,瞭解ERB,和谷歌模板引擎。 如果你需要生成網頁,電子郵件等,你會發現使用模板引擎是一個更強大的解決方案。

+0

不適用於Ruby 1.9。 – 2013-01-14 02:49:12