Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby:类实例变量与实例变量_Ruby_Instance Variables_Class Instance Variables - Fatal编程技术网

ruby:类实例变量与实例变量

ruby:类实例变量与实例变量,ruby,instance-variables,class-instance-variables,Ruby,Instance Variables,Class Instance Variables,我的想法是为那些来自java背景的人创建一个社区wiki,因为阅读了大量的解释,我无法理解任何东西,直到我真正尝试了一些东西,拼图的各个部分开始找到它们的位置。但我首先要确保我做对了。来自这样的背景,我很困惑地发现@variable可能意味着两种截然不同的东西。 以下是一个例子: class Test @ins = "gah" def self.ins puts @ins end def initialize() @ins = "wtf?" end de

我的想法是为那些来自
java
背景的人创建一个社区wiki,因为阅读了大量的解释,我无法理解任何东西,直到我真正尝试了一些东西,拼图的各个部分开始找到它们的位置。但我首先要确保我做对了。来自这样的背景,我很困惑地发现
@variable
可能意味着两种截然不同的东西。 以下是一个例子:

class Test
  @ins = "gah"
  def self.ins
    puts @ins
  end

  def initialize()
    @ins = "wtf?"
  end
  def ins2
    puts @ins
  end
end
据我所知,第一个
@ins
是表示类
Test
的对象的实例变量。第二个
@ins
是类
Test
的对象中的实例变量

现在事情开始对我有意义了。这里有几个例子:

[14] pry(main)> test.ins2
wtf?
我们调用一个对象的方法,它返回对象的实例变量

[15] pry(main)> test.ins
NoMethodError: undefined method `ins' for #<Test:0x000000017d9348 @ins="wtf?">
我们正在调用一个类方法,以便它正确地看到类对象的实例变量

[17] pry(main)> Test.ins2
NoMethodError: undefined method `ins2' for Test:Class
我们通过不正确的类调用对象方法,因此抛出
nomethoderor

所有这些都是用ruby 2.0执行的。那我要问什么

  • 我说得对吗
  • 我的ruby术语正确吗
  • 在正确设计的应用程序中,类实例变量的实际使用是否有意义?或者这些只是更好的@类变量
发现
@variable
可能意味着两种截然不同的东西,我感到非常困惑

class Test
  # class scope, uncomment following line to see the value of self
  # p self
  @ins = "gah"
  def self.ins
    # class scope
    # p self
    puts @ins
  end

  def initialize()
    # object scope
    # p self
    @ins = "wtf?"
  end
  def ins2
    # object scope
    # p self
    puts @ins
  end
end
不,没有。类是与任何其他对象一样的对象。它们可以像任何其他对象一样拥有实例变量。它们可以像任何其他对象一样拥有实例方法。事实上,与Java不同,Java有三种不同的“方法”(实例方法、静态方法和构造函数),在Ruby中,只有一种方法:实例方法

将类作为对象的美妙之处在于
@variable
总是意味着完全相同的事情

没有类实例变量:它只是一个普通的实例变量。该对象恰好是
的实例,但这不会改变实例变量的性质。类
String
的对象的实例变量不是字符串实例变量,它只是一个实例变量。类似地,类
class
的对象的实例变量只是一个实例变量

[15] pry(main)> test.ins
NoMethodError: undefined method `ins' for #<Test:0x000000017d9348 @ins="wtf?">
没有类方法:它只是一个对象的普通单例方法,恰好是
class
的实例。(实际上,也没有单例方法:它只是对象单例类的普通实例方法。)

注:红宝石爱好者可以在随意的交谈中使用术语“类方法”。但这并不意味着类方法实际上是存在的,它只意味着“类对象的单例类的实例方法”是满口的。重要的是:因为类是对象,所以它们的工作方式与所有其他对象完全相同。它们可以有实例方法(在类
class
中定义或继承自
Module
Object
Kernel
BasicObject
),它们可以有“单例方法”(实际上是各自单例类的实例方法),它们可以有实例变量


它们也可以有类变量(
@@variables
)…这些都很奇怪。忽略它们:-)

我觉得一切都很好

类变量将通过继承传递,而类上的实例变量则不会。(src:)

就设计而言,我倾向于完全避免类变量(我宁愿使用单例),但如果必须选择一个,我可能会选择类变量而不是类实例变量,以避免混淆

  • 首先,要理解实例变量,需要知道-类是对象

    所有类都是从
    对象继承的(读取文档)实例。这就是为什么类是对象

  • 然后,在
    self
    中定义每个实例变量(标有
    @
    的ID,如
    @ins

    self
    是类时,它们是类的实例变量(类实例变量)。 当
    self
    是对象时,它们是对象的实例变量(实例变量)

  • 在不同的代码范围内,
    self
    表示不同的事物

    class Test
      # class scope, uncomment following line to see the value of self
      # p self
      @ins = "gah"
      def self.ins
        # class scope
        # p self
        puts @ins
      end
    
      def initialize()
        # object scope
        # p self
        @ins = "wtf?"
      end
      def ins2
        # object scope
        # p self
        puts @ins
      end
    end
    

  • wt*?:我写了一篇有趣的文章+1您可以将其称为类方法,但从技术上讲,它不是。这是singleton类的一种方法观看这个@SamD,谢谢你的视频,我一定会看的。但我不明白为什么我要称之为“单身阶级”。这意味着还有其他类型的类。将其称为类对象的方法不是更好吗?因此,它将是“类对象”与“类实例”,前者是表示类的对象,后者是该类的对象?Singleton类是一个匿名类,在定义self.method时隐藏在后台。匿名类(Singleton)将被初始化并将方法添加到其中。之后的任何self.method都将添加到singleton@SamD对不起,我不能理解。也许这是我稍后会看的视频。但是当一切都是对象时,
    类是什么呢?在任何情况下,它都会成为一个话题。我想问的是,当所有的类都像你上面描述的那样时,为什么称它为“单例类”而不是“类”。很抱歉,在这个逻辑中,我们可以说没有什么不同,因为所有的东西实际上都是位:)在典型的OO设计中,一个实例变量和一个类实例变量(我想我们在定义上是一致的)对于程序来说,语义上是不同的。我们需要一些术语