Ruby: การรวมตัวแปรเข้ากับสตริง


97

ฉันกำลังมองหาวิธีที่ดีกว่าในการรวมตัวแปรเป็นสตริงใน Ruby

ตัวอย่างเช่นถ้าสตริงเป็นดังนี้:

"การ"animal actionsecond_animal

และฉันมีตัวแปรสำหรับanimal, actionและsecond_animalสิ่งที่เป็นวิธีที่ต้องการที่จะนำผู้ที่อยู่ในตัวแปรสตริง?

คำตอบ:


247

วิธีสำนวนคือการเขียนสิ่งนี้:

"The #{animal} #{action} the #{second_animal}"

สังเกตเครื่องหมายคำพูดคู่ (") รอบสตริง: นี่คือทริกเกอร์ให้ Ruby ใช้การแทนที่ตัวยึดในตัวคุณไม่สามารถแทนที่ด้วยเครื่องหมายคำพูดเดี่ยว (') มิฉะนั้นสตริงจะถูกเก็บไว้ตามที่เป็นอยู่


2
ขออภัยบางทีฉันอาจทำให้ปัญหาง่ายขึ้นมากเกินไป สตริงจะถูกดึงออกจากฐานข้อมูลและตัวแปรจะขึ้นอยู่กับปัจจัยหลายประการ โดยปกติฉันจะใช้การแทนที่สำหรับตัวแปร 1 หรือสองตัวแปร แต่สิ่งนี้มีความเป็นไปได้ที่จะมากกว่านี้ ความคิดใด ๆ ?
FearMediocrity

โครงสร้าง # {} น่าจะเร็วที่สุด (แม้ว่าจะยังดูขัดกับฉันอยู่ก็ตาม) เช่นเดียวกับคำแนะนำของ gix คุณยังสามารถประกอบสตริงด้วย + หรือ << แต่อาจมีการสร้างสตริงกลางขึ้นมาซึ่งมีค่าใช้จ่ายสูง
Mike Woodhouse

วิธีที่ดีที่สุดในการแก้ไขตัวแปร
Dragutescu Alexandru

118

คุณสามารถใช้การจัดรูปแบบเหมือน 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ตัวอย่างเช่นคุณไม่สามารถหลีกเลี่ยงการกำหนด


18

ฉันจะใช้ตัว#{}สร้างตามที่ระบุไว้ในคำตอบอื่น ๆ ฉันอยากจะชี้ให้เห็นว่ามีความละเอียดอ่อนอย่างแท้จริงที่นี่:

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ตัวแปรคอนสตรัคสามารถนำมาใช้เฉพาะในสายกับคำพูดคู่#{}



11

สิ่งนี้เรียกว่าการแก้ไขสตริงและคุณทำสิ่งนี้:

"The #{animal} #{action} the #{second_animal}"

สำคัญ: จะใช้ได้เฉพาะเมื่อสตริงอยู่ในเครื่องหมายคำพูดคู่ ("")

ตัวอย่างรหัสที่ไม่ทำงานตามที่คุณคาดหวัง:

'The #{animal} #{action} the #{second_animal}'

ขอขอบคุณที่ใช้คำที่เหมาะสมเพื่อให้โปรแกรมเมอร์มือใหม่สามารถเรียนรู้: การแก้ไข
Mike Bethany

3

ระบบเทมเพลต 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"

0

คุณสามารถใช้กับตัวแปรท้องถิ่นของคุณเช่นนี้:

@animal = "Dog"
@action = "licks"
@second_animal = "Bird"

"The #{@animal} #{@action} the #{@second_animal}"

การส่งออกจะเป็น: "การสุนัข เลียนก "

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.