2013-04-22 7 views
8

Jaka jest różnica w inicjowaniu przez Ruby nowego ciągu znaków za pomocą podwójnego cudzysłowu ("") kontra String.new? Dla celów ciekawość i eksperymentowanie, ja overrode String#initialize:W jaki sposób Ruby ocenia podwójne cudzysłowy (inaczej "") w porównaniu do String.new?

class String 
    def initialize 
    puts "I <3 bananas" # they're delicious! 
    end 
end 

Co próbuję dowiedzieć się: dlaczego te dwa przykłady różnią?

# Calling the String class directly, I can declare banana love! 
irb(main):054:0> String.new 
I <3 bananas 
=> "" 

# Using double quotes, this string is not as tasty :(
irb(main):055:0> "" 
=> "" 

Jest to irytujące, ponieważ każdy wynik badania Google wydaje się być skoncentrowane na podstawowej składni Ruby, i nie byłem w stanie znaleźć coś w dokumentacji Ruby.

+1

Co stanie się, jeśli zamiast tego zastąpisz opcję "przydzielić"? –

+2

@RyanBigg To dobra myśl, ale to nie ma znaczenia. Literały łańcuchowe są oceniane i mają swój obiekt utworzony podczas kompilacji, z pominięciem zarówno 'initialize' i' allocate'. –

+0

@DarshanComputing, dzięki! Wygląda na to, że musiałbym włamać się i zrekompilować Ruby ze źródła, aby "" zwrócił rzeczy inicjujące. Przeczytam więcej o literałach. – amorphid

Odpowiedz

9

Według Matz: obiekty

String dla literały są już tworzone w czasie kompilacji, która jest daleko przed przedefiniować sposób zainicjowany. Poszczególne ciągi znaków z literałów są po prostu kopią już zainicjowanych obiektów i zainicjowanymi obiektami . Cały cel metody initialize to zainicjować nowo utworzone obiekty, jak sama nazwa wskazuje. Nie czuję potrzeby wywoływania (redefiniowanej) metody inicjowania dla ciągów literowych , które zostały już zainicjalizowane w czasie kompilacji.

+0

Oczywiście, tak to działa w prawie każdym innym języku programowania. Jedynymi dwoma znanymi mi przykładami, które pozwalają na przeładowanie literałów są Ioke i Seph. –

Powiązane problemy