В чем разница между "=" & "=>" и "@variable", "@@ variable" и ": variable" в ruby? - PullRequest
9 голосов
/ 21 августа 2010

Я знаю, что это основы рельсов, но я до сих пор не знаю полной разницы между = знаком и => и разницей между @some_variable, @@some_variable и :some_variable в рельсах.

Спасибо.

Ответы [ 2 ]

18 голосов
/ 21 августа 2010

OK.

Разница между операторами = и => заключается в том, что первый - это присвоение, второй - ассоциация в хэше (ассоциативный массив). Таким образом, { :key => 'val' } говорит «создайте ассоциативный массив, ключом будет :key, а значением будет 'val'». Если вы хотите звучать как Rubyist, мы называем это «hashrocket». (Хотите верьте, хотите нет, но это не самый странный оператор в Ruby; у нас также есть <=>, или «оператор космического корабля».)

Вы можете быть сбиты с толку, поскольку в методах можно использовать ярлык, если последний параметр является хэшем, вы можете опустить волнистые скобки ({}). поэтому вызов render :partial => 'foo' в основном вызывает метод рендеринга, передавая хеш с одной парой ключ / значение. Из-за этого вы часто видите хеш как последний параметр, который имеет необязательные параметры для бедняков (вы также видите нечто подобное в JavaScript).

В Ruby любое нормальное слово является локальной переменной. Таким образом, foo внутри метода - это переменная, ограниченная уровнем метода. Префикс переменной @ означает область применения переменной для экземпляра. Так что @foo в методе - это уровень экземпляра.

@@ означает переменную класса, то есть переменные @@ находятся в области видимости класса и всех его экземпляров.

: означает символ. Символ в Ruby - это особый вид строки, который подразумевает, что он будет использоваться в качестве ключа. Если вы пришли из C # / Java, они похожи по использованию на ключевую часть перечисления. Есть и другие отличия, но в основном каждый раз, когда вы рассматриваете строку как ключ любого типа, вместо этого вы используете символ.

14 голосов
/ 21 августа 2010

Ух ты, это много разных концепций вместе.

1) = является простым старым заданием.

a = 4;
puts a

2) => используется для объявления хэшей

hash = {'a' => 1, 'b' => 2, 'c' => 3}
puts hash['b'] # prints 2

3) @var позволяет получить доступ к переменной экземпляра объекта.

class MyObject
    def set_x(x)
        @x = x
    end
    def get_x
        @x
    end
end

o = MyObject.new
o.set_x 3
puts o.get_x # prints 3

4) @@var позволяет получить доступ к переменным класса («статическим»).

class MyObject
    def set_x(x)
        @@x = x # now you can access '@@x' from other MyObject instance
    end
    def get_x
        @@x
    end
end

o1 = MyObject.new
o1.set_x 3
o2 = MyObject.new
puts o2.get_x  # prints 3, even though 'set_x' was invoked on different object

5) Я обычно думаю о :var как о специальном классе 'label'. Пример 2 можно перефразировать так:

hash = {:a => 1, :b => 2, :c => 3}
puts hash[:b] # prints 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...