2013-04-30 34 views
6

Sadece String#split ile aşağıdaki tek davranış keşfetti:Neden bölünmüş ('') akıllı olmaya çalışıyor?

"a\tb c\nd".split 
=> ["a", "b", "c", "d"] 

"a\tb c\nd".split(' ') 
=> ["a", "b", "c", "d"] 

"a\tb c\nd".split(/ /) 
=> ["a\tb", "c\nd"] 

The source (2.0.0 dan string.c) 200 satır uzunluğundadır ve bunun gibi bir ifadeleri içermektedir:

/* L 5909 */ 
else if (rb_enc_asciicompat(enc2) == 1) { 
    if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' '){ 
     split_type = awk; 
    } 
} 

Daha sonra awk bölünmüş türünün kodunda, gerçek argüman artık kullanılmaz ve düz split ile aynıdır.

  • Bunun bir şekilde kırıldığını hisseden başka biri var mı?
  • Bunun için iyi nedenler var mı?
  • Böyle "büyü" böyle çoğu insan Ruby'de düşünebilir daha sık olur mu? documentation üzerinden
+0

Neden belgelenmiş "çok akıllı" bir şey var? Metin ayırmak için kullanmak için alternatif bir desen geçirerek seçerseniz, geçersiz kılabileceğiniz varsayılan bir davranışdır. –

+0

Çok akıllıca demek istediğim ruby, tüm boşluk karakterlerine bölmek istediğimi tahmin ediyor, tam anlamıyla boşluklara bölmek için söylüyorum. –

+0

Bu soruyu kapatmak için oy kullanacağım, çünkü muhtemelen bu soruya genel olarak tatmin edici bir cevap olmadığını fark ettim. Bütün cevaplarınız ve yorumlarınız için teşekkürler! –

cevap

4

Perl'nin split() davranışları ile tutarlı. Hangi sırayla Gnu awk'ssplit() dayanmaktadır. Bu yüzden Unix'deki kökeni ile uzun süredir devam eden bir gelenek. başka bir özel durum olarak

, split MODEL atlanırsa ya komut satırı aracı awk'ın varsayılan davranışı veya tek boşluk karakteri oluşan bir hazır dize öykünür: perldocsplit andan itibaren

('' veya '\ x20' gibi, gibi, ancak// gibi değil. Bu durumda, EXPR'deki herhangi bir öncü boşluk, ayrılmadan önce kaldırılır ve PATTERN yerine/\ s +/ise olarak kabul edilir; özellikle, bu, herhangi bir bitişik beyaz boşluğunun (sadece tek bir boşluk karakteri değil) bir ayırıcı olarak kullanıldığı anlamına gelir. Ancak, bu özel işlem, "" dizesi yerine desen// belirtilerek önlenebilir, böylece yalnızca bir boşluk karakterinin bir ayırıcı olmasına izin verilir.

+1

Perl'in bölünmesiyle biraz oynadım ve bunun Perl'de mantıklı olduğunu fark ettim, çünkü bir argümana ihtiyacı var. Boş bir dize işe yaramaz çünkü bu başka bir özel durumdur (yakutta olduğu gibi bir dizi karakter döndürür). Perl'de argüman olmadan bölünmeye en yakın şey “split” (undef, $ str) 'dır ancak bu aslında 'split (' ', $ str)' gibi değil, split (' ', $ str) 'gibi davranır. Sanırım oldukça tutarlı değil :). Sonuçta, bu gibi şeyler neden böyle tartışıyor ve Perl zaten çok sık yapılan bu yüzden burada duracağım yüzden :) –

+0

Cevabınız yine de en iyisi kabul ediyorum. Teşekkürler! –

+0

İlginç tarih. – davogones

2

Kontrol, özellikle bu kısmı:

desen, bir dize olan str bölüşülürken sonra içeriği sınırlayıcı olarak kullanılması halinde. Desen tek bir boşluksa, str, beyaz boşlukta, boşlukta boşluklarla ve bitişik boşluklar karakterlerin yok sayılmasıyla bölünür.

Desen atlanırsa, $; kullanıldı. Eğer dolar ise; nil ( varsayılanıdır), str, '‘belirtilmiş gibi boşlukta bölünür.

Dizeyi ayırmak için bir regexp kullanabilirsiniz.

+0

Teşekkürler! Belgeleri okudum. Benim sorum daha çok “Gidip düzeltmeli miyiz yoksa bunun için iyi bir neden var mı?” Gibi. ” –

+0

En azından bunun amaçlandığını biliyoruz. Matz'ın neden böyle tasarlandığını bulmaya çalışabiliriz ve bunun da garip olduğunu iddia edebiliriz. Ama "gidip tamir edemezsin". Kim karar verirse Matz. – sawa

+0

Tabi ki Matz, MRI'nın geleceği hakkında karar verir. Ama yine de ona olası iyileştirmeler için bir noktaya kadar gidebiliriz;) –