Ruby 关于 Ruby 类的实例变量

simlegate · 2012年10月30日 · 最后由 u1442016572 回复于 2015年09月12日 · 11213 次阅读

先上代码:

class A
    @i = 1
    def he
    @u = 1
    end
end

变量@u我知道是属于 A 对象的实例变量,@i是 A 的实例变量,但我不知道@i该怎么用? 大神救我!

like this?

A.instance_eval{@i}
匿名 #2 2012年10月30日

定义 instance methods

#1 楼 @fsword A.class_eval{@i},顺便问以下,你的代码高亮是怎么弄的?

#2 楼 @nuclearkitten 你的意思是

class A
   @u = 1
   def he
      @u 
    end
end

是不?

#3 楼 @simlegate 论坛支持 markdown,如果不了解可以 google 一下

@i是 A 的实例变量??// 莫非你的原来的意思是 @@i=1?????
至于用法么,和@u一样,@u怎么用,@@i 也怎么用 网上搜一下 Class Variable 也许会对你有用。。。。。。

楼上正解。

class A
  class << self
    attr_reader :i
  end
    @i = 1
    def he
    @u = 1
    end
end

A.i #=>1
匿名 #10 2012年10月30日

#4 楼 @simlegate 还是去看书把,书上讲有时的比在论坛上求助好多了。。。

这些东西自己学比较枯燥的,大家讨论还是个不错的方式。

class << self 这个是所谓的 eigenclass,貌似比较高深,不知道是不是常用的写法,是否有更简单的?

#6 楼 @richard020389 我想表达的就是@i ,不是@@i,怎么理解?

#7 楼 @Jungledrum 我能理解二者关系,但是不会用 Class instance variables

类也是对象,类的实例变量 和 对象的实例变量没什么区别。

类的实例变量和类变量同样是绑定在类上的,但还是有区别的:

  • 类变量可以从实例方法访问,类的实例变量不能
  • 类变量子类可见
class A
  @i = "ivar"
  @@i = "class var"
  # 实例方法可以访问类变量, 但不能访问类的实例变量
  def f
    p @i  #=> nil
    p @@i #=> "class var"
  end
end
A.new.f

class B < A
  p @i   # nil
  p @@i  # "class var"
end

想避免污染子类的话推荐用类的实例变量,然后用类上的方法访问

class A
  # 类上的方法可以访问类的实例变量
  def A.i
    @i 
  end
end

#9 楼 @jjym 正解,直接用 eigenclass,不用 eval。

我也是刚看到。类变量,类实例变量,实例变量。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号