为什么在Ruby类模型中使用@变量?

时间:2013-03-19 01:25:37

标签: ruby-on-rails ruby

为什么课程中需要@variables?他们增加了什么价值?我在网上找不到任何东西,但也许我正在寻找错误的条款。有在线资源我可以查看吗?谢谢!

car.rb

class Car
  attr_accessor :make, :model

  def initialize(make = '')
    @make = ''
    @model = ''
  end
end

5 个答案:

答案 0 :(得分:2)

这些变量称为实例变量。该类的每个实例都有自己的这些变量副本。

在您的示例中,您希望Car类的每个实例都拥有自己的品牌和型号。

请注意以下示例

car1 = Car.new("Toyota", "Carola")
car2 = Car.new("Mitsubishi", "Lancer")

car1和car2都有自己的私人makemodel。告诉Ruby解释器执行此操作的方法是使用@。

答案 1 :(得分:1)

这是在ruby中定义实例变量的语法。

答案 2 :(得分:1)

实例变量可用于每个类实例的所有区域。

每次创建汽车实例时,变量都特定于该特定的变量。

e.g。

car1 = Car.new('Ford', 'Falcon')
car2 = Car.new('Toyota', 'Camry')

现在car1和car2有不同的@make和@model实例。

如果使用@@make将变量声明为类变量,那么每个Car都可以访问它,每次更改时,都会为每个人更改。

基本上,类变量允许您在数据周围放置一些“墙”。

attr_accessor会在您的通话中创建两种方法

def make=(value)
@make = value
end

def make
@make
end

这允许您在没有@

的情况下在类外部调用实例变量

e.g。

car1.make

返回

'Ford'

www.codecademy.com有一些很棒的免费基础Ruby课程,可以很好地教你这些东西。

答案 3 :(得分:0)

据说对象具有行为和属性,就像现实世界对象一样。 对象的属性由实例变量定义。而@前缀是 ruby告诉特定变量的方式是实例变量/特征。

  

他们添加了什么价值?

它们可以帮助您获得可在所有实例方法中访问的变量。

让我们讨论你的例子

   class Car
    attr_accessor :make, :model #attr_accessor methods creates a getter method.    car_instance.make and
                 #a setter method car_instance.make=(val), which otherwise you would have to do explicitly. 

    def initialize(make = '')   #constructor
      @make = '' #initializing your instance variables. I guess you meant @make = make here     
      @model = ''
    end
   end
  

我在网上找不到任何东西,但也许我正在寻找错误的条款。

你是谁。

  

网上有资源我可以查看吗?

是的,Ruby User Guide来自Matz

更多细节

在ruby中,类中变量的范围由编译器通过前两个字符标识    可变名称。

  • @@ variable_name - >两个'@'。类的所有实例中的类变量/范围。例如:如果您想计算您制造的汽车总数。

  • @variable - >实例中的一个“@”实例变量/范围。

  • 变量 - >没有'@'局部变量/它们所属的块的范围。

答案 4 :(得分:-1)

请看下面的代码,为了理解我改变了一下:

class Car
  attr_accessor :make, :model

  def initialize(make = '')
    @make = make
    @model = ''
  end
end

car1 = Car.new("Toyota")
car2 = Car.new("Roxin")
p car1.instance_variables #<~~ A
p car2.instance_variables #<~~ B
p car1 #<~~C
p car2#<~~D

输出:

[:@make, :@model]
[:@make, :@model]
#<Car:0x1bc89e8 @make="Toyota", @model="">
#<Car:0x1bc8940 @make="Roxin", @model="">

说明:在 A B 中,您可能会想到car1,car2都使用了相同的实例变量副本。但事实并非如此。查看我在打印car1和car2时,在 C D 中,输出显示car1和car2对实例变量@make保持不同的值。这个事实对象有自己独特的实例变量。

希望这有帮助。

干杯!!