ruby - 在 self.method 中看起来像这个 @my_variable 的实例变量是什么意思?

标签 ruby

我不明白类方法中的实例变量的作用。下面的代码对我来说毫无意义。类方法如何操作实例变量?我什至可以在没有实例的情况下调用类方法。

def self.schema
    return @schema if @schema
    DB.table_info(table) do |row|
      @schema[row['name']] = row['type']
    @schema
end    

编辑:在@Aetherus 的回答后跟进问题。
以下代码示例中的 first_name 是什么?为什么我不能将它作为类变量访问,因为它在类范围内?为什么这 3 种方法都会给我错误?

   class Person
     #class scope
      first_name = "jimmy"

       # expected error beacuse it would treat as local variable
      def print_name
        #instance scope
       first_name
      end

       #to my understanding this should work, but it doesnt. i dont know why
      def print_name_2
        #instance scope
        #with self.class i should be able to access class scope?
        self.class.first_name
      end  

      #to my understading this should work, but it doesnt. I dont know why.   
      def self.print_name
        #class scope
        #inside class scope, i should able to access first_name?
        first_name
       end

    end

最佳答案

简而言之,这些实例变量属于类,而不是属于该类的实例。

要理解它,您需要更多地了解 Ruby。

类是对象

在 Ruby 中,所有的类都是 Class 类型的对象。

String.class  #=> Class
Array.class   #=> Class
Class.class   #=> Class

并且可以通过实例化Class来定义匿名类

foo = Class.new do
  # Here you can define methods
end

foo.new  #=> an instance of an anonymous class

因为类是对象,它们也可以有实例变量。

作用域之门

触发作用域切换的关键字有4个:module, class, def and do (for blocks ).这里我只显示classdef

# in the scope of main

class Foo
  # in the scope of Foo

  def self.bar
    # still in the scope of Foo
  end

  # in the scope of Foo

  def bar
    # in the scope of an instance of Foo
  end

  # back to the scope of Foo again
end

# back to the scope of main

作用域中定义的实例变量属于该作用域的当前对象(又名self)。在前面的示例中,如果您在 Foo 范围内定义了一个实例变量,则该实例变量属于该范围的 self,即类 Foo

关于ruby - 在 self.method 中看起来像这个 @my_variable 的实例变量是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39176840/

相关文章:

arrays - 按相应范围对数组进行排序

ruby-on-rails - 如何增加 rails 中 HTTParty post 方法的超时时间?

ruby-on-rails - 这个语法在 Ruby 中是什么意思? .. tasks.all?(& :complete? )

ruby - 如何在 Sequel 的 where 语句中使用 json 字段?

ruby-on-rails - 使用关联测试 Rspec Controller

ruby-on-rails - 不允许的参数,嵌套形式 - Ruby On Rails

mysql - ROR 无法远程连接到 MySQL DB

ruby-on-rails - Rails 中的模型日期验证

ruby-on-rails - 如何设计调用多个类方法的rake任务?

ruby-on-rails - 将默认参数添加到 Rails 中的命名路由助手中