Ruby 在类外部和方法内部创建实例变量意味着什么?

Ruby 在类外部和方法内部创建实例变量意味着什么?,ruby,Ruby,在ruby语言中,在类之外创建实例变量意味着什么 e、 g: 我还看到它是在方法之外编写的,如下所示: @foo=“bar” 这只是糖的语法吗 谢谢 在ruby中创建类外变量的实例意味着什么 实例变量与类无关。它们属于对象,即实例,这就是它们被称为“实例”变量的原因 def my_方法 @动物=“猫” 结束 这不会创建实例变量。它创建了一个名为my_method的方法,当您调用它时,它将分配给名为@animal的实例变量 这没什么特别的。调用此方法时,它将分配给调用此方法的任何对象的@ani

在ruby语言中,在类之外创建实例变量意味着什么

e、 g:

我还看到它是在方法之外编写的,如下所示:

@foo=“bar”
这只是糖的语法吗

谢谢

在ruby中创建类外变量的实例意味着什么

实例变量与类无关。它们属于对象,即实例,这就是它们被称为“实例”变量的原因

def my_方法
@动物=“猫”
结束
这不会创建实例变量。它创建了一个名为
my_method
的方法,当您调用它时,它将分配给名为
@animal
的实例变量

这没什么特别的。调用此方法时,它将分配给调用此方法的任何对象的
@animal
实例变量,就像分配实例变量的任何其他方法一样

例如:

class-Foo
def my_方法
@动物=‘猫’
结束
结束
foo=foo.new
bar=Foo.new
如果调用
foo.my_方法
,它将分配给
foo
的实例变量
@animal
,如果调用
bar.my_方法
,它将分配给
bar
的实例变量
@animal

就实例变量而言,这两个示例之间实际上没有什么不同

唯一有趣的问题是“在哪个类中定义了方法?”但这与实例变量无关

在顶层定义的方法成为
对象的私有实例方法

@foo=“bar”
同样,这与对实例变量的任何其他赋值没有什么不同。这将分配给当前任何对象的名为
@foo
的实例变量
self

从实例变量的角度来看,这绝对没有什么特别之处
@foo='bar'
始终表示“分配给当前任何对象的名为
@foo
的实例变量”。它没有其他意义

唯一有趣的问题是:“在这一点上,
self
是什么?”但这与实例变量无关

在顶层,
self
始终是Ruby社区中通常称为
main
的匿名对象

只是糖吗


不,这不是什么语法糖。这只是一个任务,就像其他任务一样。它绝对没有什么特别之处。

如果在命令行中执行此操作:

%ruby-e“放置self;放置self.class”
主要的
对象
您将看到在顶级范围内(不在
类或
模块内),您将在名为
main
对象的实例范围内

对于
main
class
module
来说,您已经知道的关于使用实例变量和定义方法等的知识是相同的

class-Foo
结束
foo_main=foo.new#创建'foo'的实例`
福班
self#那么,在类'Foo'的范围内`
#=>Foo
def foo#为类'foo'定义实例方法`
放“福”
结束
结束
foo_main.foo#在'foo'的实例上调用方法`
#=>foo
#在顶层,Ruby运行时似乎已经做了一些事情
#例如“Object.new”,然后将您“放入”创建的实例中
my_main=self#已在'main'的范围内
#=>主要
定义栏#为类`对象定义实例方法`
“酒吧”
结束
#以下都是等效的
我的酒吧
自助酒吧
bar#隐含的'self'是main,是'Object'的一个实例`
您可能已经注意到:

  • Foo
    内部,
    self
    返回
    Foo
    ,一个类
  • 在顶层,
    self
    返回
    main
    ,类
    对象的实例
虽然看起来它们是两种不同的东西,但Ruby的工作原理是它们实际上是一样的!更具体地说,它是:

  • Foo
    内部,
    self
    返回
    Foo
    ,class
    class
  • 在顶层,
    self
    返回
    main
    ,类
    对象的实例

如果编写的方法没有任何类,那么该方法将被包装在对象类中。这些都是对象类中的实例变量。我发现wierd在这方面的作用是,顶层的常规方法(例如,
def foo;end
)被添加为对象的实例方法,但实例变量似乎只应用于
main
(对象的实例),因此它们不会传递给其他类(从对象继承)但是,这并没有什么特别的。实例变量总是以
self
结尾,方法总是以默认定义对象结尾。通常,默认定义是最接近的词汇封闭模块定义,但在顶层没有词汇封闭上下文,所以有两个选择:不允许方法定义beca使用没有默认定义者或找到合适的默认定义者,我认为让它们成为
Object
private
方法是一个很好的选择。好吧,很酷,听起来好像在顶层有一些特殊的方法来确定“默认定义者”。因为这里不是
self
,正如您所说,它实际上是ObjectNo,方法没有特殊的大小写。方法总是在默认定义对象上定义的。默认定义对象通常是最接近的词汇包围模块定义体…除非它不是。两个主要的例外是反射方法,如
Module#等级评估
模块
def my_method:
  @animal = "cat"
end