我正在读一本关于Ruby / Rails的书,并对一些简单的问题有疑问。在下面的方法“转向”中,作者使用“self”,它指的是类。但是,如果他离开了“自我”并且刚刚做了什么,那么差异(就你能做什么和做什么而言)是什么(
)direction = new_direction
代码
class Car << ActiveRecord::Base
validates :direction, :presence => true
validates :speed, :presence => true
def turn(new_direction)
self.direction = new_direction
end
end
答案 0 :(得分:3)
一些背景:红宝石中“自我”的存在只是意味着当前的对象。您会看到类似这样的类方法,其中方法是在类上定义的,而不是实例。
class Cookbook
def self.find_recipe
end
def is_awesome?
true
end
end
这个find_recipe
是Cookbook上的一个方法,所以你可以通过Cookbook.find_recipe
来调用它,你可以通过以下方式在一个实例上调用is_awesome:
cookbook = Cookbook.new
puts cookbook.is_awesome?
所以:调用self.direction=
的原因是作者不想在方法中创建一个名为direction的变量。如果作者有:
class Car
attr_accessor :direction
def turn(new_direction)
direction = new_direction
end
end
然后你会看到:
car = Car.new
car.direction = :left
car.turn(:right)
car.direction
=> :left
将其更改为self.direction,然后它将正确设置实例的变量。
答案 1 :(得分:2)
这会将局部变量a
设置为值b
a = b
但这有所不同:
self.a = b
这实际上以a=
方式运行b
方法。它实际上意味着:
self.a=(b)
最后,虽然可以在self
上调用方法并提供self
作为接收方,但对于分配,不为真。 a = b
永远不会调用a=
方法,只会分配一个局部变量。
答案 2 :(得分:1)
ActiveRecord
访问 self
(持久)变量。
这里,self
将列(DB)变量与“普通”非持久化实例属性区分开来。不同之处在于,在保存或更新时,该值不会保存在数据库中。
答案 3 :(得分:1)
见这里:http://snippets.dzone.com/posts/show/7963
self.direction = new_direction
将新值分配给Car实例上的'direction'属性,而
direction = new_direction
创建一个名为'direction'的局部变量并返回其值但不更新Car实例。
例如,我相信应该发生以下情况:
class Car << ActiveRecord::Base
validates :direction, :presence => true
validates :speed, :presence => true
def turn(new_direction)
self.direction = new_direction
end
def set_speed(new_speed)
speed = new_speed
end
end
alf = Car.new
alf.direction = "North"
alf.speed = 1
alf.turn = "South"
alf.set_speed = 5
> alf.direction
=> "South"
> alf.speed
=> 1