Dlaczego interpolacja ciągów działa w Rubim, gdy nie ma nawiasów klamrowych?

90

Właściwy sposób używania interpolacji ciągów w Rubim jest następujący:

name = "Ned Stark"
puts "Hello there, #{name}" #=> "Hello there, Ned Stark"

To jest sposób, w jaki zamierzam go zawsze używać.

Jednak zauważyłem coś dziwnego w interpolacji ciągów Rubiego. Zauważyłem, że interpolacja ciągów działa w Rubim bez nawiasów klamrowych w odniesieniu do zmiennych instancji. Na przykład:

@name = "Ned Stark"
puts "Hello there, #@name" #=> "Hello there, Ned Stark"

I że próbowanie tego samego, co w przypadku zmiennej niebędącej instancją, nie działa.

name = "Ned Stark"
puts "Hello, there, #name" #=> "Hello there, #name"

Próbowałem tego z powodzeniem zarówno w wersji 1.9.2, jak i 1.8.7.

Dlaczego to działa? Co tu robi tłumacz?

Charles Caldwell
źródło

Odpowiedzi:

103

Według The Ruby Programming Language autorstwa Flanagana i Matsumoto:

Gdy wyrażenie, które ma być interpolowane do literału ciągu, jest po prostu odwołaniem do zmiennej globalnej, instancji lub klasy, wówczas można pominąć nawiasy klamrowe.

Więc wszystko powinno działać:

@var = "Hi"
puts "#@var there!"  #=> "Hi there!"

@@var = "Hi"
puts "#@@var there!" #=> "Hi there!"

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"
tsherif
źródło
4
Przy okazji, fajne pytanie. Miło jest wrócić i znaleźć zakamarki języka, o którym zapomniałem.
tsherif
2
Chociaż twoja odpowiedź nie zawiera powodu, dlaczego ani co się dzieje, stwierdzam, że jest to trudne do określenia. Nawet stare fora dyskusyjne, na których często komentował Matz, nie pomagają. Jednak twoja odpowiedź pokazuje, że jest to funkcja, a nie tylko fuks.
Charles Caldwell,
1
Nie jestem jednak pewien, czego oczekujesz jako powodu. Czy masz na myśli decyzję projektową? Domyślam się, że była to próba użycia składni podobnej do Perla , ponieważ uważam, że Ruby został pierwotnie pomyślany jako rodzaj Perla ++, zanim stał się jego własnym.
tsherif
2
Jestem kompletnym noobem i właśnie moje IDE narzekało, że to robię. Ale ciężko pracuję, przekonując siebie, że to dobry styl. Jest to bezsensownie niespójne i ma wadę - np. Jeśli mam zmienną instancji @distance o wartości 100 i chcę utworzyć ciąg, który mówi coś w rodzaju „100m”, używając wyrażenia takiego jak „# @ distancem”, po prostu otrzymam pusty ciąg ponieważ nie ma zmiennej instancji „distancem”. Więc to brzmi jak po prostu zły styl.
terriblememory
3
@terriblememory Och, to zdecydowanie zły styl. Dlatego zacząłem swoje pytanie od wskazania właściwego sposobu zrobienia tego. Jednak po prostu wydało mi się dziwne, że w ogóle była to cecha języka i zastanawiałem się, dlaczego to działa. Z drugiej strony, złe jest też rozpoczynanie zdania spójnikiem. Ale nadal będziesz widzieć ludzi używających go tu i tam. =)
Charles Caldwell