为什么@variables
需要在课堂上?他们增加了什么价值?我在网上找不到任何东西,但也许我正在搜索错误的术语。网上有资源我可以查一下吗?谢谢!
碳水化合物
class Car
attr_accessor :make, :model
def initialize(make = '')
@make = ''
@model = ''
end
end
为什么@variables
需要在课堂上?他们增加了什么价值?我在网上找不到任何东西,但也许我正在搜索错误的术语。网上有资源我可以查一下吗?谢谢!
碳水化合物
class Car
attr_accessor :make, :model
def initialize(make = '')
@make = ''
@model = ''
end
end
这些变量称为实例变量。类的每个实例都有自己的这些变量的副本。
在您的示例中,您希望 Car 类的每个实例都有自己的品牌和型号。
请注意以下示例
car1 = Car.new("Toyota", "Carola")
car2 = Car.new("Mitsubishi", "Lancer")
car1 和 car2 都有自己的私有make
和model
。告诉 Ruby 解释器这样做的方法是使用 @。
这就是在 ruby 中定义实例变量的语法。
实例变量在类的每个实例的所有区域都可用。
每次创建 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 基础免费课程,可以很好地教你这些东西。
据说对象具有行为和属性,就像现实世界的对象一样。对象的属性由实例变量定义。@ 前缀是 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 -> 一个“@”实例变量/跨实例的范围。
变量 -> 没有“@”局部变量/它们所属块的范围。
看下面的代码,为了理解我做了一些改动:
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 都使用相同的实例变量副本。但事实并非如此。看看当我在C和D中打印 car1 和 car2 时,输出显示 car1 和 car2 为实例变量持有不同的值@make
。这个事实对象有自己独特的实例变量。
希望这可以帮助。
干杯!!