Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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 在类定义的方法名中显式使用'self'_Ruby_Self_Class Eval - Fatal编程技术网

Ruby 在类定义的方法名中显式使用'self'

Ruby 在类定义的方法名中显式使用'self',ruby,self,class-eval,Ruby,Self,Class Eval,此代码来自Rails速成课程手册: class Accessor def self.accessor(attr) class_eval " def #{attr} @#{attr} end def #{attr}=(val) @#{attr} = val end " end end 其思想是,Accessor的子类可以通过调用Accessor方法来创建getter和setter方法,方法的

此代码来自Rails速成课程手册:

class Accessor
  def self.accessor(attr)
    class_eval "
      def #{attr}
        @#{attr}
      end

      def #{attr}=(val)
        @#{attr} = val
      end
    "
  end
end
其思想是,
Accessor
的子类可以通过调用
Accessor
方法来创建getter和setter方法,方法的属性名是我们希望为其生成getter和setter方法的:

class Element < Accessor
  accessor :name
...
class元素

但是,为什么要在
def self.accessor(attr)
中使用
self

,因为要为类的所有实例定义访问器;您不希望为某些实例定义它们,也不希望为其他实例定义它们。因此,定义访问器是要针对类而不是实例执行的操作;因此,
accessor
必须是类方法,而不是实例方法。使用时将在类正文中调用它。

因为您要为类的所有实例定义访问器;您不希望为某些实例定义它们,也不希望为其他实例定义它们。因此,定义访问器是要针对类而不是实例执行的操作;因此,
accessor
必须是类方法,而不是实例方法。使用时将在类正文中调用它。

因为您要为类的所有实例定义访问器;您不希望为某些实例定义它们,也不希望为其他实例定义它们。因此,定义访问器是要针对类而不是实例执行的操作;因此,
accessor
必须是类方法,而不是实例方法。使用时将在类正文中调用它。

因为您要为类的所有实例定义访问器;您不希望为某些实例定义它们,也不希望为其他实例定义它们。因此,定义访问器是要针对类而不是实例执行的操作;因此,
accessor
必须是类方法,而不是实例方法。使用时将在类主体中调用它。

确实如此!我来自Java和python,我忘记了定义类方法的语法。谢谢你,真的!我来自Java和python,我忘记了定义类方法的语法。谢谢你,真的!我来自Java和python,我忘记了定义类方法的语法。谢谢你,真的!我来自Java和python,我忘记了定义类方法的语法。非常感谢。