此代码中类变量的用途

时间:2012-01-05 02:01:07

标签: ruby-on-rails ruby

我正在读一本关于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

4 个答案:

答案 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)

由于AR的实施,必须使用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