2010-08-21 2 views

ответ

18

ОК.

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

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

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

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

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

14

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

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 в качестве особого класса 'этикетки'. Пример 2 можно перефразировать следующим образом:

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

Пример 3 и 4 меня смущает, я не вижу различий в примерах 3 и 4. –

+0

@Simon Запустите пример # 4 с @x вместо @@ x, и вы увидите разницу –

Смежные вопросы