Ruby: Değişkenleri bir dizede birleştirme


97

Ruby'de değişkenleri bir dizede birleştirmenin daha iyi bir yolunu arıyorum.

Örneğin dize aşağıdaki gibi bir şeyse:

" "animal actionsecond_animal

Ve ben değişkenleri var animal, actionve second_animaldizesine, bu değişkenleri koymak için tercih edilen yöntem nedir?

Yanıtlar:


247

Deyimsel yol şöyle bir şey yazmaktır:

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

Dizeyi çevreleyen çift tırnak işaretlerine (") dikkat edin: Bu, Ruby'nin yerleşik yer tutucu ikamesini kullanması için tetikleyicidir. Bunları tek tırnaklarla (') değiştiremezsiniz veya dizge olduğu gibi tutulacaktır.


2
Üzgünüm, belki sorunu çok basitleştirmişimdir. Dize bir veritabanından çekilecek ve değişken bir dizi faktöre bağlı olacaktır. Normalde 1 veya iki değişken için bir değiştirme kullanırdım, ancak bunun daha fazla olma potansiyeli var. Düşüncesi olan var mı?
— FearMediocrity

# {} Yapısı muhtemelen en hızlısıdır (yine de bu bana mantıksız görünmektedir). Gix'in önerisinin yanı sıra, + veya << ile dizeleri bir araya getirebilirsiniz, ancak maliyetli olan bazı ara dizeler oluşturulabilir.
— Mike Woodhouse

Değişkenleri enterpolasyon etmenin en iyi yolu
— Dragutescu Alexandru

118

Dizeye değerler enjekte etmek için sprintf benzeri biçimlendirmeyi kullanabilirsiniz. Bunun için dizenin yer tutucular içermesi gerekir. Argümanlarınızı bir diziye yerleştirin ve şu yollardan birini kullanın: (Daha fazla bilgi için Kernel :: sprintf belgelerine bakın .)

fmt = 'The %s %s the %s'
res = fmt % [animal, action, other_animal]  # using %-operator
res = sprintf(fmt, animal, action, other_animal)  # call Kernel.sprintf

Hatta bağımsız değişken numarasını açıkça belirtebilir ve bunları karıştırabilirsiniz:

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

Veya, karma anahtarları kullanarak bağımsız değişkeni belirtin:

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

%Operatöre tüm bağımsız değişkenler için bir değer sağlamanız gerektiğini unutmayın . Örneğin, tanımlamadan kaçınamazsınız animal.


18

#{}Diğer cevapların belirttiği gibi kurucuyu kullanırdım . Burada dikkat edilmesi gereken gerçek bir incelik olduğunu da belirtmek isterim:

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

Dizeler tek tırnaklarla oluşturulabilirken ( first_nameve last_namedeğişkenleriyle gösterildiği gibi , #{}kurucu yalnızca çift tırnaklı dizelerde kullanılabilir.


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

bunu yapmanın başka bir yolu.


11

Buna dize enterpolasyonu denir ve bunu şu şekilde yaparsınız:

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

Önemli: sadece dizge çift tırnak ("") içindeyken çalışır.

Beklediğiniz gibi çalışmayacak kod örneği:

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

Yeni programcıların öğrenebilmesi için doğru terimi kullandığınız için teşekkür ederiz: enterpolasyon.
— Mike Bethany

3

Standart ERB şablonlama sistemi senaryonuz için çalışabilir.

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

Bunu, aşağıdaki gibi yerel değişkenlerinizle kullanabilirsiniz:

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

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

çıkış olacaktır: " Köpek yalıyor Kuş "

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.