Ruby 中的“主要”是啥?
Posted
技术标签:
【中文标题】Ruby 中的“主要”是啥?【英文标题】:What is "main" in Ruby?Ruby 中的“主要”是什么? 【发布时间】:2010-10-29 09:40:44 【问题描述】:如果我将此文件作为“ruby x.rb
”运行:
class X
end
x = X.new
调用“X.new
”的东西是什么?
它是一个对象/进程/等吗?
【问题讨论】:
我觉得这个问题可以从这个问题的上下文中受益:***.com/questions/916795 同一个人提问。哈哈 【参考方案1】:Ruby 中的一切都发生在某个对象的上下文中。顶层的对象称为“main”。它基本上是一个具有特殊属性的 Object 实例,其中定义的任何方法都被添加为 Object 的实例方法(因此它们在任何地方都可用)。
所以我们可以制作一个完全由以下内容组成的脚本:
puts object_id
@a = 'Look, I have instance variables!'
puts @a
它会打印“105640”和“看,我有实例变量!”。
这不是你通常需要关心的事情,但它就在那里。
【讨论】:
其他一些答案是说“ruby解释器”正在调用新方法。但我认为你是说在此之前有一个中间步骤。也就是说,创建了一个 Object 的实例,并且所有执行都通过该对象进行调解。我真的只是想填补我对“新”方法如何作为消息传递给 X 对象的理解的空白。从您所说的看来,主要(对象实例)将新方法作为消息传递给 X Class 实例。我越来越近了吗? 好吧,我想从技术上讲,你可以说它是 Ruby 解释器,它完成了一切,因为它是真正执行你的代码的东西。但是从语言的角度来看,是的,您的描述听起来完全正确。在顶层,当您第一次开始输入 Ruby 时,您处于该对象的上下文中。大多数人不会像对象一样使用顶层,但它就是一个。 @steel 你知道这种神奇的行为记录在哪里吗? 从语言的角度来看?从 Smalltalk 的角度来看?也许是的,发件人是main
对象。不确定,也不确定这里的所有内容是否适用。 Ruby 肯定受到 Smalltalk 的影响。但是要明确发送消息,我们使用X.send(:new)
,而不是send(X, :new)
。在 Smalltalk 中也不是这样。我们有caller
method,而不是sender
。所以我认为涉及 Smalltalk 是牵强的。这就是我建议考虑的术语。main
是调用者。 main
在类 X
上调用方法 new
。
我觉得没有其他 question/answer 这个没有意义。【参考方案2】:
***调用者是一个对象main,它属于Object类。
试试这个 ruby 程序:
p self
p self.class
【讨论】:
【参考方案3】:这是 X 类。您正在调用创建 X 类对象的方法“new”。因此,如果您将此文本作为脚本运行,Ruby:
创建一个新类 X,它是 Object 的子类,它自动(作为 Object 的子类)继承了一些方法,new
就是其中之一。
设置名称x
在新类X
上调用new
方法,创建一个X 实例对象; x 获得对该对象的引用。
【讨论】:
【参考方案4】:这是运行该行的 ruby 解释器
x = X.new
与许多脚本语言一样,脚本是从上到下解释的,而不是像大多数编译语言那样具有标准的入口点方法。
【讨论】:
是的,我想问这个问题的人从 C 程序员的角度指的是main
。这里的其他人似乎都在考虑 Ruby 中名为 main
的***对象,这并不完全相同。【参考方案5】:
正如查理·马丁所说,X.new 是对 X 类的构造函数的调用,它返回一个 X 类型的对象,存储在变量 x 中。
根据您的标题,我认为您正在寻找更多内容。 Ruby 不需要 main,它按照看到的顺序执行代码。因此,必须在调用它们之前包含依赖项。
因此,您的 main 是在类或模块定义之外编写的任何过程式代码。
【讨论】:
做 ruby -e "把自己"。它将打印“主要”。它是***上下文对象。 我的意思只是你没有声明 main 方法,因为原始发帖人似乎在他的问题中暗示了这一点。以上是关于Ruby 中的“主要”是啥?的主要内容,如果未能解决你的问题,请参考以下文章