1

为什么@variables需要在课堂上?他们增加了什么价值?我在网上找不到任何东西,但也许我正在搜索错误的术语。网上有资源我可以查一下吗?谢谢!

碳水化合物

class Car
  attr_accessor :make, :model

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

5 回答 5

2

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

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

请注意以下示例

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

car1 和 car2 都有自己的私有makemodel。告诉 Ruby 解释器这样做的方法是使用 @。

于 2013-03-19T01:31:39.013 回答
1

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

于 2013-03-19T01:28:17.183 回答
1

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

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

例如

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

这允许您在没有 @ 的情况下在类内部和外部调用实例变量

例如

car1.make

返回

'Ford'

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

于 2013-03-19T01:38:57.473 回答
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

我在网上找不到任何东西,但也许我正在搜索错误的术语。

是的,你是。

网上有资源我可以查一下吗?

是的,Matz的Ruby 用户指南

更多细节

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

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

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

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

于 2013-03-19T07:51:16.857 回答
-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="">

解释:AB中,您可能会认为 car1、car2 都使用相同的实例变量副本。但事实并非如此。看看当我在CD中打印 car1 和 car2 时,输出显示 car1 和 car2 为实例变量持有不同的值@make。这个事实对象有自己独特的实例变量。

希望这可以帮助。

干杯!!

于 2013-03-19T01:39:14.003 回答