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.