“=”和&之间的区别是什么? “=>” 中红宝石中的“@variable”,“@@ variable”和“:variable”?

时间:2010-08-21 19:27:36

标签: ruby-on-rails ruby

我知道这些是rails的基础知识,但我仍然不知道=符号和=>之间的完全差异以及@some_variable@@some_variable:some_variable之间的差异在rails中{{1}}。

感谢。

2 个答案:

答案 0 :(得分:18)

行。

==>运算符之间的区别在于第一个是赋值,第二个表示哈希(关联数组)中的关联。所以{ :key => 'val' }说“创建一个关联数组,:key是关键,'val'是值”。如果你想听起来像Rubyist,我们称之为“hashrocket”。 (信不信由你,这不是Ruby中最奇怪的操作符;我们也有<=>或“太空船操作员”。)

您可能会感到困惑,因为您可以在方法中使用一些快捷方式,如果最后一个参数是哈希,则可以省略波浪括号({})。所以调用render :partial => 'foo'基本上是调用render方法,传入一个带有单个键/值对的哈希。因此,你经常会看到一个哈希作为最后一个具有穷人可选参数的参数(你也可以在JavaScript中看到类似的东西)。

在Ruby中,任何普通单词都是局部变量。因此,方法内的foo是一个作用于方法级别的变量。使用@前缀变量意味着将变量作用于实例。所以方法中的@foo是实例级别。

@@表示一个类变量,意味着@@变量在类的范围内,以及所有实例。

:表示符号。 Ruby中的符号是一种特殊的字符串,暗示它将用作键。如果您来自C#/ Java,它们的使用类似于枚举的关键部分。还有一些其他差异,但基本上任何时候你都要将字符串视为任何类型的键,你使用符号代替。

答案 1 :(得分: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