Yeni satırları soymadan Ruby'de birden çok satırda uzun dizeler ayırmak


221

Son zamanlarda bir yakut tarzı rehber işime karar verdi. Yazılardan biri, hiçbir satırın 80 karakterden daha geniş olmaması gerektiğidir. Bu bir Rails projesi olduğundan, genellikle biraz daha uzun dizelerimiz var - yani " X Kullanıcısı size 80 karakter stili sınırına uymayan" Şey Y hakkında bir mesaj göndermek istedi ".

Uzun bir dize birden çok satır yaymak için üç yolu olduğunu anlıyorum:

  • heredoc
  • % S {}
  • Gerçek dize birleştirme.

Bununla birlikte, tüm bu davalar daha aptalca görünen daha fazla hesaplama döngüsü alıyor. Dize birleştirme açıkça, ama için HEREDOCve %Qben gibi bir şey aracılığıyla, yeni satırları çıkarmak zorunda .gsub(/\n$/, '').

Bunu yapmanın saf bir sözdizimi yolu var mı, bu sadece tüm dizeyi bir satırda tutmakla eşdeğer mi? Amaç, açıkçası, sadece kodumu biraz daha okunabilir olmasını istiyorum çünkü herhangi bir ekstra döngüleri harcamak değil. (Evet, bu ödünleşmeyi çok yapmak zorunda olduğunuzu anlıyorum ... ancak dize uzunluğu için bu sadece aptalca görünüyor.)

Güncelleme: Ters eğik çizgiler tam olarak istediğim gibi değil çünkü stili / okunabilirliği gerçekten etkileyen girintiyi kaybediyorsunuz.

Misal:

if foo
  string = "this is a \  
string that spans lines"  
end

Yukarıdakileri okumak biraz zor.

EDIT : Aşağıya bir cevap ekledim; üç yıl sonra şimdi kıvrımlı otçu var.


Bu dizeleri hesaba katmak zaman ayırmaya değer olabilir.
Cheezmeister


New🏼 Yeni \nsatır karakterlerini saklamak isteyip istemediğiniz belirsizdir . En iyi cevap onları korumaz, ancak cevabınızı tutar. Soru "satırsonu sıyırmadan" diyor - açıklamada "[...] satırsonlarını çıkarmak zorundayım" yazıyor.
Bryan Dimas

Yanıtlar:


432

Belki de aradığınız budur?

string = "line #1"\
         "line #2"\
         "line #3"

p string # => "line #1line #2line #3"

4
ha. evet, bu oldukça mükemmel. bu aslında kaputun altında bir bitiştirme yapıyor mu? (a +? gizleniyor)
chug2k

13
Emin değilim; Hem undef'ing hem de String # + yeniden tanımlamak denedim ve orada bir şey gönderiliyor gibi görünmüyor.
Jessehz

Ayrıca, dizeleri aynı satırda yan yana koymak da işe yarıyor, ancak bu çok kullanışlı değil.
Jessehz

3
Emily'nin çözümünü de seviyorum. Ama bir nedenden dolayı bu konuda daha rahatım çünkü aşağıdaki satırlarda önde gelen beyaz boşluklar, kendini ikinci olarak tahmin etmeden girintili olabilir.
Amin Ariana

5
Yeniden birleştirme, Amadan'ın bu ilgili soruya cevabını kontrol edin . Bayt kodunu dizeleri birleştirmediğini, uzun bir işlem olarak kullandığını kanıtlamak için kullanır.
Tom Hundt

55

\Ruby'nin herhangi bir satırının sonraki satırda devam ettiğini belirtmek için kullanabilirsiniz . Bu, dizelerle de çalışır:

string = "this is a \
string that spans lines"

puts string.inspect

çıktı olacak "this is a string that spans lines"


11
ha. bu oldukça basit. muhtemelen sormak için çok fazla, ama bir sonraki satıra girintilemiyorum. eşittir işaretiyle eşleştirebilseydim ideal olurdu.
chug2k

5
Not: Bu ters eğik çizgiden sonra herhangi bir boşluk bırakamazsınız. Son karakter olmalı.
Julian Mann

3
@Jessehz tarafından verilen cevaba bakınız. Uygun girintileme ile güzel biçimlendirilmiş kod sahip olmanın yolu, her satırı tırnak içine almaktır.
orrd

36

Üç yıl sonra, şimdi Ruby 2.3'te bir çözüm var: Kıvrımlı otçu.

class Subscription
  def warning_message
    <<~HEREDOC
      Subscription expiring soon!
      Your free trial will expire in #{days_until_expiration} days.
      Please update your billing information.
    HEREDOC
  end
end

Blog yayını bağlantısı: https://infinum.co/the-capsized-eight/articles/multiline-strings-ruby-2-3-0-the-squiggly-heredoc

En az girintili satırın girintisi, içeriğin her satırından kaldırılacaktır.


29
Merak eden herkes için: <<~HEREDOCyeni satır karakterlerini tutar, sadece girintiyi aşar. Örn.line 1\nline 2\nline 3\n
Bryan Dimas

1
Ancak, yeni satırların çıkarılması, OP türünün ima edilmesinin istenmediği ekstra hesaplama gerektirecektir.
henrebotha

1
@henrebotha Evet, ancak OP daha açık bir şekilde, "tüm dizginin tek bir satırda eşdeğer olmasını" istediğini ve bu da yeni satır gerektirmeyeceğini söyledi.
Nick

Bu nedenle, sorunuzda bir yorumlu metin kullanmak istemediğinizi ve yeni satırları çıkarmak zorunda olduğunuzu açıkça söylediniz. Buradaki cevabınız bir yorumlu metin kullanıyor ve kaçınmak istediğiniz "post-processing" i gerektiriyor.
lamont

18

Çok uzun bir url yazmaya çalıştığımda bu sorunla karşılaştım, aşağıdaki işler.

image_url = %w(
    http://minio.127.0.0.1.xip.io:9000/
    bucket29/docs/b7cfab0e-0119-452c-b262-1b78e3fccf38/
    28ed3774-b234-4de2-9a11-7d657707f79c?
    X-Amz-Algorithm=AWS4-HMAC-SHA256&
    X-Amz-Credential=ABABABABABABABABA
    %2Fus-east-1%2Fs3%2Faws4_request&
    X-Amz-Date=20170702T000940Z&
    X-Amz-Expires=3600&X-Amz-SignedHeaders=host&
    X-Amz-Signature=ABABABABABABABABABABAB
    ABABABABABABABABABABABABABABABABABABA
).join

URL dizesi oluşturulduğunda herhangi bir satırsonu, beyaz boşluk olmamalıdır. Yeni satırlar istiyorsanız, HEREDOC kullanın.

Burada okunabilirlik, modifikasyon kolaylığı, her satırdaki alıntılar ve ters eğik çizgiler olmadan girintiniz var. Dizelere katılmanın maliyeti göz ardı edilebilir olmalıdır.


10

Zack'lerin cevabını boşluk ve enterpolasyon istediğimden beri değiştirdim, ancak yeni satırlar kullanmadım ve kullandım:

%W[
  It's a nice day "#{name}"
  for a walk!
].join(' ')

bunun nerede name = 'fred'ürettiğiIt's a nice day "fred" for a walk!

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.