Ruby: Menggabungkan variabel menjadi string

95

Saya mencari cara yang lebih baik untuk menggabungkan variabel menjadi string, di Ruby.

Misalnya jika stringnya seperti:

"The animal actionthe second_animal"

Dan saya memiliki variabel untuk animal, actiondan second_animal, cara apa yang disukai untuk menempatkan variabel tersebut ke dalam string?

FearMediocrity
sumber

Jawaban:

240

Cara idiomatiknya adalah dengan menulis sesuatu seperti ini:

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

Perhatikan tanda kutip ganda (") yang mengelilingi string: ini adalah pemicu Ruby untuk menggunakan pengganti placeholder bawaannya. Anda tidak dapat menggantinya dengan tanda kutip tunggal (') atau string akan disimpan apa adanya.

Mike Woodhouse
sumber
2
Maaf, mungkin saya terlalu menyederhanakan masalah. String akan ditarik dari database, dan variabel bergantung pada sejumlah faktor. Biasanya saya akan menggunakan pengganti untuk 1 atau dua variabel, tetapi ini memiliki potensi lebih. Ada pemikiran?
FearMediocrity
Konstruksi # {} mungkin yang tercepat (meskipun itu masih tampak berlawanan dengan intuisi saya). Selain saran gix, Anda juga dapat merakit string dengan + atau <<, tetapi mungkin ada beberapa string perantara yang dibuat, yang mahal harganya.
Mike Woodhouse
Cara terbaik untuk menginterpolasi variabel
Dragutescu Alexandru
115

Anda dapat menggunakan pemformatan seperti sprintf untuk memasukkan nilai ke dalam string. Untuk itu string harus menyertakan placeholder. Letakkan argumen Anda ke dalam array dan gunakan salah satu cara berikut: (Untuk info lebih lanjut, lihat dokumentasi untuk 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

Anda bahkan dapat secara eksplisit menentukan nomor argumen dan mengacaknya:

'The %3$s %2$s the %1$s' % ['cat', 'eats', 'mouse']

Atau tentukan argumen menggunakan kunci hash:

'The %{animal} %{action} the %{second_animal}' %
  { :animal => 'cat', :action=> 'eats', :second_animal => 'mouse'}

Perhatikan bahwa Anda harus memberikan nilai untuk semua argumen ke %operator. Misalnya, Anda tidak dapat menghindari definisi animal.

gix
sumber
18

Saya akan menggunakan #{}konstruktor, seperti yang dinyatakan oleh jawaban lainnya. Saya juga ingin menunjukkan bahwa ada kehalusan nyata yang harus diperhatikan di sini:

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

Sementara string dapat dibuat dengan tanda kutip tunggal (seperti yang ditunjukkan oleh first_namedan last_namevariabel, yang #{}konstruktor hanya dapat digunakan dalam string dengan tanda kutip ganda.

Starkers
sumber
13
["The", animal, action, "the", second_animal].join(" ")

adalah cara lain untuk melakukannya.

Andrew Grimm
sumber
10

Ini disebut interpolasi string, dan Anda melakukannya seperti ini:

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

Penting: ini hanya akan bekerja jika string ada di dalam tanda kutip ganda ("").

Contoh kode yang tidak akan berfungsi seperti yang Anda harapkan:

'The #{animal} #{action} the #{second_animal}'
sqrcompass
sumber
Terima kasih telah menggunakan istilah yang tepat sehingga pemrogram baru dapat mempelajari: interpolasi.
Mike Bethany
3

Sistem template ERB standar dapat bekerja untuk skenario Anda.

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"
Clint Pachl
sumber
0

Anda dapat menggunakannya dengan variabel lokal Anda, seperti ini:

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

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

output akan menjadi: "The Dog menjilati yang Bird "

Níkolas La Porta
sumber