如果您正在学习Ruby,则可能会发现“ self”关键字的使用非常混乱。
它是如何工作的?
到底是
self
什么?这是一个Ruby关键字,可让您访问当前对象。
该“当前对象”取决于上下文。
上下文?
是的,上下文是您代码在任何给定时刻的位置。
这是一个例子:
获取我的终极Ruby秘籍表: 这个方便的7页PDF帮助您快速找到所需的Ruby语法,正在寻找的Ruby方法或您不太记得其名称的内置类。
您可以自己查看此操作。
运行此代码:
- def 咖啡
- 看跌期权自
- 结束
- 咖啡
- #主要
这段代码定义并调用了一个
coffee
打印的值的方法self
。为什么打印
main
?因为它是顶级对象的名称,所以它是一个对象,您可以在其中找到在类外部定义的所有方法。
就像
coffee
这里的方法一样。但是,如果您在名为的类中定义了一个方法
Cat
,那么self
它将是一个Cat
对象。如此处所示:
- 猫类
- 高清喵
- 看跌期权自
- 结束
- 结束
- 猫。新的。喵
- #<猫:0x7a14c5>
从这些示例中,我们可以看出
self
更改的值取决于您使用它的位置。现在:
我相信您可以通过了解目的来更好地理解任何内容。
为什么
self
有用?让我们看一些例子。
使用自我消除歧义
一种实际用途
self
是能够分辨出方法与局部变量之间的区别。给变量和方法命名相同的想法不是一个好主意。但是,如果您必须处理这种情况,则可以使用调用该方法
self.method_name
。这就是我的意思:
- 类示例
- def do_something
- 香蕉= “变量”
- 放香蕉
- 看跌期权的自我。香蕉
- 结束
- def 香蕉
- “方法”
- 结束
- 结束
- 实例。新的。做一点事
- #“ variable” =>放香蕉
- #“ method” =>放置self.banana
这里
banana
在do_something
方法内部有一个局部变量,但也有一个banana
方法。局部变量优先。
这就是为什么
self
要调用该banana
方法而不是打印banana
变量值的原因,请在这里使用。下一个:
让我们看一个更常见的用例……定义类方法!
使用自我定义类级方法
self
毫无疑问,第一个用途是定义类级别的方法。我敢肯定你看过他们。
这些
def self.method_name
方法的定义。像这样一个:
- 色拉类
- 定义自我。buy_olive_oil
- #...
- 结束
- 结束
- 沙拉。buy_olive_oil
这
self
相当于Salad
类名。为什么这有用?
因为我们不必为每个方法定义使用类名,所以如果更改类,则使我们的代码更易于更改。
这也使代码的噪音更少,更易于阅读。
这就是为什么我们做
def self.buy_olive_oil
的不是def Salad.buy_olive_oil
。自我的其他用途
是!
的用途更多
self
,因此熟悉它会很有帮助。例如:
您可以在一种方法中使用它来将当前对象与另一个对象进行比较。
像这样的东西:
- def == (其他)
- 自我==其他
- 结束
您也可以将其
self
用于调试目的,以查找正在使用的对象。像这样:
- p 自我
或者,您可以将其用作返回值,以实现诸如Builder Design Pattern的设计模式。
范例:
- 色拉类
- def 初始化
- @ingredients = [ ]
- 结束
- def add_nuts
- @ingredients << :坚果
- 自
- 结束
- 结束
- my_salad = 沙拉。新的。add_nuts
总而言之,这是对self有用的列表:
- 定义类级别的方法
- 当您具有相同名称的局部变量时,请使用实例方法
- 返回自我(构建者模式)
- 调试
- 比较对象(==)
- 方法调用的默认接收者
自我与自我
在完成本主题之前,我们应该看的另一件事。
该
Kernel#itself
方法。您可以在对象上调用此方法,然后该对象将返回自身。
范例:
- [ 1 ,2 ,3 ,零] 。选择(&:itself )
- #[1、2、3]
本示例过滤器
nil
和false
值。了解差异:
- self是一个关键字。价值取决于您在哪里使用
- itself是一种方法。它的价值取决于什么对象,你使用它(中1.itself,1是对象)
希望对您有所帮助。
结论
您已经了解了Ruby self关键字,它的确切含义,为什么有用以及如何使用它。
现在轮到您尝试一下。
谢谢阅读!