Ruby 在类外部和方法内部创建实例变量意味着什么?
在ruby语言中,在类之外创建实例变量意味着什么 e、 g: 我还看到它是在方法之外编写的,如下所示:Ruby 在类外部和方法内部创建实例变量意味着什么?,ruby,Ruby,在ruby语言中,在类之外创建实例变量意味着什么 e、 g: 我还看到它是在方法之外编写的,如下所示: @foo=“bar” 这只是糖的语法吗 谢谢 在ruby中创建类外变量的实例意味着什么 实例变量与类无关。它们属于对象,即实例,这就是它们被称为“实例”变量的原因 def my_方法 @动物=“猫” 结束 这不会创建实例变量。它创建了一个名为my_method的方法,当您调用它时,它将分配给名为@animal的实例变量 这没什么特别的。调用此方法时,它将分配给调用此方法的任何对象的@ani
@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
,classclass
- 在顶层,
self
返回main
,类对象的实例
如果编写的方法没有任何类,那么该方法将被包装在对象类中。这些都是对象类中的实例变量。我发现wierd在这方面的作用是,顶层的常规方法(例如,def foo;end
)被添加为对象的实例方法,但实例变量似乎只应用于main
(对象的实例),因此它们不会传递给其他类(从对象继承)但是,这并没有什么特别的。实例变量总是以self
结尾,方法总是以默认定义对象结尾。通常,默认定义是最接近的词汇封闭模块定义,但在顶层没有词汇封闭上下文,所以有两个选择:不允许方法定义beca使用没有默认定义者或找到合适的默认定义者,我认为让它们成为Object
的private
方法是一个很好的选择。好吧,很酷,听起来好像在顶层有一些特殊的方法来确定“默认定义者”。因为这里不是self
,正如您所说,它实际上是ObjectNo,方法没有特殊的大小写。方法总是在默认定义对象上定义的。默认定义对象通常是最接近的词汇包围模块定义体…除非它不是。两个主要的例外是反射方法,如Module#等级评估
,模块
def my_method:
@animal = "cat"
end