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 混淆类和对象之间的行为_Ruby_Metaprogramming - Fatal编程技术网

Ruby 混淆类和对象之间的行为

Ruby 混淆类和对象之间的行为,ruby,metaprogramming,Ruby,Metaprogramming,因为我们知道类也是类的对象。我有一个疑问。 我在这里定义了一个类Foo和一个打印对象的方法 class Foo def bar puts self end puts self end 当我执行Foo.new.bar操作时,o/p将# 表示类Foo的对象。 为什么方法外部的self不打印#作为类的对象? 对不起,如果我的问题是错误的,请澄清。类和模块的名称在ruby中是常量。因此,当您定义一个类时,您正在创建一个class class的对象并为其提供一个常量名称,因此当您

因为我们知道类也是类的对象。我有一个疑问。 我在这里定义了一个类Foo和一个打印对象的方法

class Foo
  def bar
    puts self
  end
    puts self
end
当我执行Foo.new.bar操作时,o/p将
#
表示类Foo的对象。 为什么方法外部的self不打印
#
作为类的对象?
对不起,如果我的问题是错误的,请澄清。

类和模块的名称在ruby中是常量。因此,当您定义一个类时,您正在创建一个class class的对象并为其提供一个常量名称,因此当您在类上下文中执行
放置self
时,它会给出一个类名,而不是类似于

的类名和模块名在ruby中是常量。因此,当您定义一个类时,您正在创建一个class class的对象,并为其提供一个常量名称,因此当您在类上下文中执行
放置self
时,它会给出一个类名,而不是类似

的内容。以下是定义类/对象的一种稍微不同的方法:

klass = Class.new {
  puts self
  def bar
    puts self
  end
}
# #<Class:0x3fbdbb8>
当您第一次用大写字母命名类时(例如
示例
),它会将其作为输出,而不是像:
#
这样的神秘名称

Foo = Class.new {
  puts self
  def bar
    puts self
  end
}
仍然输出神秘的名称,因为
Foo=
的部分尚未计算

puts Foo
输出正确的名称-
Foo

如果我再说一遍怎么办?
没什么
Foo
将永远是
Foo

以下是定义类/对象的一种稍微不同的方法:

klass = Class.new {
  puts self
  def bar
    puts self
  end
}
# #<Class:0x3fbdbb8>
当您第一次用大写字母命名类时(例如
示例
),它会将其作为输出,而不是像:
#
这样的神秘名称

Foo = Class.new {
  puts self
  def bar
    puts self
  end
}
仍然输出神秘的名称,因为
Foo=
的部分尚未计算

puts Foo
输出正确的名称-
Foo

如果我再说一遍怎么办?
没什么
Foo
将永远是
Foo

解析行
class Foo
后,
self
Foo
并且在类解析完成之前执行
puts self
<代码>放置self因此打印
Foo
。稍后,当您创建实例并在其上调用
bar
时,
self
Foo
的实例,因此这就是打印的内容。请仔细阅读。。在分析行
class Foo
之后,
self
Foo
并且
put self
在类的分析完成之前执行<代码>放置self因此打印
Foo
。稍后,当您创建实例并在其上调用
bar
时,
self
Foo
的实例,因此这就是打印的内容。请仔细阅读。。