Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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';s define_方法对实例变量有特殊访问权限吗?_Ruby_Instance Variables_Class Instance Variables - Fatal编程技术网

Ruby';s define_方法对实例变量有特殊访问权限吗?

Ruby';s define_方法对实例变量有特殊访问权限吗?,ruby,instance-variables,class-instance-variables,Ruby,Instance Variables,Class Instance Variables,我正在学习Ruby,偶然发现了一些类似于下面的代码,它显示了实例变量和类实例变量之间的差异。我已经在我的控制台中对它进行了测试,它的工作原理如所述(输出“John”)。我不明白的是define_方法如何访问@name实例变量,而不在name前面加上@?它是否有一种特殊的能力允许它这样做 class User attr_reader :name def self.name "User" end def initialize(name) @name = name

我正在学习Ruby,偶然发现了一些类似于下面的代码,它显示了实例变量和类实例变量之间的差异。我已经在我的控制台中对它进行了测试,它的工作原理如所述(输出“John”)。我不明白的是
define_方法
如何访问
@name
实例变量,而不在
name
前面加上
@
?它是否有一种特殊的能力允许它这样做

class User
  attr_reader :name

  def self.name
    "User"
  end

  def initialize(name)
    @name = name
  end

  define_method(:output_name) do
    puts name
  end
end

user1 = User.new("John")
user1.output_name #=> “John”
这是关于范围的

  define_method(:output_name) do
    puts name
  end
put name
部分具有实例范围

因此,它可以访问实例方法,例如

attr_reader :name

attr\u reader:name
@name
实例变量创建一个getter,例如
def name@名称end
这是在
output\u name
中调用的方法,与
define\u method
无关,在本例中是
self.class。define\u method
将在
对象上定义一个类实例方法,这意味着几乎所有对象现在都有这个方法。然而,
define\u singleton\u method
将在本征类范围内应用此方法,我认为这就是您正在寻找的for@engineersmnky是的,很好,你说得对。这不是真正的“关于范围”,而是关于
name
@name
之间的区别。他们认为
define\u方法
在某种程度上能够访问
@name
,而不需要
@
,这当然不是正在发生的事情。