ฉันกำลังมองหาวิธีที่ดีกว่าในการรวมตัวแปรเป็นสตริงใน Ruby
ตัวอย่างเช่นถ้าสตริงเป็นดังนี้:
"การ"animal
action
second_animal
และฉันมีตัวแปรสำหรับanimal
, action
และsecond_animal
สิ่งที่เป็นวิธีที่ต้องการที่จะนำผู้ที่อยู่ในตัวแปรสตริง?
ฉันกำลังมองหาวิธีที่ดีกว่าในการรวมตัวแปรเป็นสตริงใน Ruby
ตัวอย่างเช่นถ้าสตริงเป็นดังนี้:
"การ"animal
action
second_animal
และฉันมีตัวแปรสำหรับanimal
, action
และsecond_animal
สิ่งที่เป็นวิธีที่ต้องการที่จะนำผู้ที่อยู่ในตัวแปรสตริง?
คำตอบ:
วิธีสำนวนคือการเขียนสิ่งนี้:
"The #{animal} #{action} the #{second_animal}"
สังเกตเครื่องหมายคำพูดคู่ (") รอบสตริง: นี่คือทริกเกอร์ให้ Ruby ใช้การแทนที่ตัวยึดในตัวคุณไม่สามารถแทนที่ด้วยเครื่องหมายคำพูดเดี่ยว (') มิฉะนั้นสตริงจะถูกเก็บไว้ตามที่เป็นอยู่
คุณสามารถใช้การจัดรูปแบบเหมือน sprintf เพื่อแทรกค่าลงในสตริง สำหรับสตริงนั้นจะต้องมีตัวยึดตำแหน่ง ใส่อาร์กิวเมนต์ของคุณลงในอาร์เรย์และใช้วิธีเหล่านี้: (สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสารสำหรับ Kernel :: sprintf )
fmt = 'The %s %s the %s'
res = fmt % [animal, action, other_animal] # using %-operator
res = sprintf(fmt, animal, action, other_animal) # call Kernel.sprintf
คุณยังสามารถระบุหมายเลขอาร์กิวเมนต์อย่างชัดเจนและสับเปลี่ยนไปรอบ ๆ :
'The %3$s %2$s the %1$s' % ['cat', 'eats', 'mouse']
หรือระบุอาร์กิวเมนต์โดยใช้แฮชคีย์:
'The %{animal} %{action} the %{second_animal}' %
{ :animal => 'cat', :action=> 'eats', :second_animal => 'mouse'}
โปรดทราบว่าคุณต้องระบุค่าสำหรับอาร์กิวเมนต์ทั้งหมดให้กับ%
ตัวดำเนินการ animal
ตัวอย่างเช่นคุณไม่สามารถหลีกเลี่ยงการกำหนด
ฉันจะใช้ตัว#{}
สร้างตามที่ระบุไว้ในคำตอบอื่น ๆ ฉันอยากจะชี้ให้เห็นว่ามีความละเอียดอ่อนอย่างแท้จริงที่นี่:
2.0.0p247 :001 > first_name = 'jim'
=> "jim"
2.0.0p247 :002 > second_name = 'bob'
=> "bob"
2.0.0p247 :003 > full_name = '#{first_name} #{second_name}'
=> "\#{first_name} \#{second_name}" # not what we expected, expected "jim bob"
2.0.0p247 :004 > full_name = "#{first_name} #{second_name}"
=> "jim bob" #correct, what we expected
ในขณะที่สายสามารถสร้างขึ้นด้วยราคาเดียว (ตามที่แสดงให้เห็นโดยfirst_name
และlast_name
ตัวแปรคอนสตรัคสามารถนำมาใช้เฉพาะในสายกับคำพูดคู่#{}
["The", animal, action, "the", second_animal].join(" ")
เป็นอีกวิธีหนึ่งที่ทำได้
สิ่งนี้เรียกว่าการแก้ไขสตริงและคุณทำสิ่งนี้:
"The #{animal} #{action} the #{second_animal}"
สำคัญ: จะใช้ได้เฉพาะเมื่อสตริงอยู่ในเครื่องหมายคำพูดคู่ ("")
ตัวอย่างรหัสที่ไม่ทำงานตามที่คุณคาดหวัง:
'The #{animal} #{action} the #{second_animal}'
ระบบเทมเพลต ERB มาตรฐานอาจใช้ได้กับสถานการณ์ของคุณ
def merge_into_string(animal, second_animal, action)
template = 'The <%=animal%> <%=action%> the <%=second_animal%>'
ERB.new(template).result(binding)
end
merge_into_string('tiger', 'deer', 'eats')
=> "The tiger eats the deer"
merge_into_string('bird', 'worm', 'finds')
=> "The bird finds the worm"
คุณสามารถใช้กับตัวแปรท้องถิ่นของคุณเช่นนี้:
@animal = "Dog"
@action = "licks"
@second_animal = "Bird"
"The #{@animal} #{@action} the #{@second_animal}"
การส่งออกจะเป็น: "การสุนัข เลียนก "