كيف يمكنني الاقتداء بايثون اسمه printf المعلمات في روبي ؟
سؤال
في بيثون ، يمكنك القيام بذلك:
print "Hi! I'm %(name)s, and I'm %(age)d years old." % ({"name":"Brian","age":30})
ما هو أقرب وأبسط روبي لغة إلى تكرار هذا السلوك ؟ (لا monkeypatching فئة سلسلة من فضلك.)
تحرير: واحدة من ممتازة حقا الفوائد من هذا هو أنه يمكنك تخزين ما قبل معالجة سلسلة في متغير واستخدامه بمثابة "قالب" ، كما يلي:
template = "Hi! I'm %(name)s, and I'm %(age)d years old."
def greet(template,name,age):
print template % ({"name":name,"age":age})
ومن الواضح أن هذا هو تافهة سبيل المثال ، ولكن هناك الكثير من المرافق في كونها قادرة على تخزين هذه سلسلة لاستخدامها في وقت لاحق.روبي "Hi! I'm #{name}"
الاتفاقية cursorily مماثلة ، ولكن الفوري التقييم يجعلها أقل تنوعا.
من فضلك لا downvote إجابات اقتراح #{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
أو (هذا يحتاج روبي 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
.
نصائح أخرى
يمكنك أن تفعل ذلك من هذا القبيل:
values = {:hello => 'world', :world => 'hello'}
puts "%{world} %{hello}" % values
قراءة هذا لمزيد من المعلومات:http://ruby.runpaint.org/strings#sprintf-hash
إذا كنت بحاجة إلى شيء أكثر تطورا ، قرأت عن إرب و جوجل قالب محركات.إذا كنت بحاجة إلى إنشاء صفحات ويب ورسائل البريد الإلكتروني وما إلى ذلك.ستجد أن استخدام قالب محركات أكثر قوة الحل.
هناك بعض خدعة لطيفة إلى هذا في روبي:
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})
ليس هذا هو بالضبط ما طلبته ولكن يمكن أن تعطيك تلميحا.
في سلسلة مزدوجة-نقلا عن في روبي ، يمكنك إدراج نتيجة روبي مثل هذا التعبير:
puts "Hi! I'm #{name}, and I'm #{age} years old."
فقط ضع التعبير داخل الأقواس المتعرجة.(كما يمكن أن يكون شيئا أكثر تعقيدا مثل #{سن + 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"]]
يضع "مرحبا!أنا #{اسم} و أنا #{العمر} عاما".