كيف يمكنني الاقتداء بايثون اسمه printf المعلمات في روبي ؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

في بيثون ، يمكنك القيام بذلك:

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

يضع "مرحبا!أنا #{اسم} و أنا #{العمر} عاما".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top