【问题标题】:difference between declaring object with single '@' and double '@' in Ruby [duplicate]在 Ruby 中用单“@”和双“@”声明对象之间的区别 [重复]
【发布时间】:2012-10-26 06:10:09
【问题描述】:

可能重复:
What does @@variable mean in Ruby?

当我用双'@'声明一个对象时有什么区别

@@lexicon = Lexicon.new()

并在 Ruby 中使用单个“@”声明对象?

@lexicon = Lexicon.new()

【问题讨论】:

  • 我不明白为什么这个问题被否决了。这是一个完全合理的问题。
  • 我也没有跨度>
  • @RyanBigg:如果您将鼠标悬停在投反对票箭头上,您将看到一个工具提示,其中列出了投反对票的一些可能的合法原因。其中之一是“这个问题没有显示任何研究工作”。这个问题没有:即使是最基本的初学者 Ruby 教程也回答了这个问题,并且可以通过 3 秒的 Google 搜索轻松回答,第一个结果是 SO 上的重复。代码 sn-ps 违反了基本的 Ruby 编码风格这一事实进一步强化了 OP 没有付出任何努力自己回答问题的表现。
  • @RyanBigg:你能看看这个问题吗:这是一个红宝石问题。 stackoverflow.com/questions/13122615/…
  • @JörgWMittag: 链接到 a) google 结果和 b) 返回的问题,并带有 kind 消息,解释该问题之前已被问过,这比匿名好得多投反对票。

标签: ruby oop class object


【解决方案1】:

区别在于第一个是类变量,第二个是实例变量。

一个实例变量只对一个对象的那个实例可用。即

class Yasin
  def foo=(value)
    @foo = value
  end

  def foo
    @foo
  end
end

yasin = Yasin.new
yasin.foo=1
yasin.foo #=> 1
yasin_2 = Yasin.new
yasin_2.foo #> nil

类变量可用于定义类变量的类(和子类,iirc)的所有个实例。

class Yasin
  def foo=(value)
    @@foo = value
  end

  def foo
    @@foo
  end
end

yasin = Yasin.new
yasin.foo=1
yasin.foo #=> 1
yasin_2 = Yasin.new
yasin_2.foo #=> 1

【讨论】:

  • 您能举例说明一下吗?据我所知,它们都是 Lexicon 类的对象,对吧?
  • 您最初的问题是“有什么区别?”。我解释了其中的区别。
  • 一个问题:python中是否存在类似的东西?
  • 我不知道答案。你问了一个 Ruby 问题,所以我给出了一个 Ruby 答案。
猜你喜欢
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
相关资源
最近更新 更多