Ruby 求教个实例变量的作用域问题

shijin880921 · 2015年09月11日 · 最后由 u1442016572 回复于 2015年09月12日 · 2633 次阅读

代码如下:

class Variable
  @shili01 = 10
  @shili02 = 20

  def shili
    puts @shili01 = 30
    puts @shili02
    puts @shili03 = 50

  end

  def self.t
    puts @shili01
    puts @shili02
  end
end

object = Variable.new
object.shili
puts "=======分割线======="
Variable.t

输入结果

30

50 =======分割线======= 10 20

问题

为啥 在方法 shili 中 输出 @shili02 时的值是 nil,而再 self.t 方法输出时 @shili02的值 是 20? @shili02 是实例变量吧,他的作用域是啥? Thanks!

写的位置不一样,实际看上去同名的是不同变量。写在 def 内的才是实例变量。

写在 def 外的是类实例变量,属于 Variable 这个类。

你这个一个刚开始定义的类对象的实例变量,下面定义的是类的实例对象的实例变量。两者不是一样的

#1 楼 @chenge 谢谢!你意思 def 外面的那个@shili02 是类变量?而不是实例变量?那么疑问又来了,如果同样写在 def 里面的@@shili02 的话,他是类变量,还是实例变量?

在 ruby 里,你必须清楚当前的 self 是谁

#3 楼 @shijin880921 我有个想法,不用去研究这些,一般会用实例变量就够了。

@@是所谓的类变量。 @是实例变量,分两种。就是你例子中的两种吧。类本身是一个对象,概念是类似的。不过确实绕口容易混淆。

#5 楼 @chenge 你好,可否给个地址,能详细描述下这个规则的。

当遇到 class、module、def,程序会进入一个新的作用域

#2 楼 @zlfera 类对象的实例变量和类的实例对象的实例变量 这两个定义怎么区分?

这样看是否有点帮助,还是更迷糊了。

class Variable
  @@x = 3

  @shili01 = 10
  @shili02 = 20

  class << self
    attr_reader :shili01, :shili02
  end

  def shili
    puts @shili01 = 30
    puts @shili02
    puts @shili03 = 50

    puts Variable.shili01
    puts Variable.shili02

    puts @@x
  end

  def Variable.t
    puts @shili01
    puts @shili02
  end
end

object = Variable.new
object.shili
puts "=======分割线======="
Variable.t

#9 楼 @chenge 哈哈 ruby 新人,还不晓得 << 是啥。继承么?还是啥。

#10 楼 @shijin880921 << self 是所谓的单件类,对应的就是你前面的两个变量。

你可以看下 ruby of rails 作用域,部分。 首先三个概念你要弄清楚: 类变量、类对象变量、类实例变量。

class A
   @@va  = "Variable of class A"
  @b = "Variable of class instance of A"
  def f 
     @c = "Variable of instance of A"
  end 
end 
需要 登录 后方可回复, 如果你还没有账号请 注册新账号