Ruby中的自我是什么以及如何使用它(明确解释)

Baklib
Baklib 最后一次编辑 接近 4 年前
1019
如果您正在学习Ruby,则可能会发现“ self”关键字的使用非常混乱。
它是如何工作的?
到底是self什么?
这是一个Ruby关键字,可让您访问当前对象。
如果您不知道什么是物体,请观看我为您制作的视频。它与面向对象的编程有关
该“当前对象”取决于上下文。
上下文?
是的,上下文是您代码在任何给定时刻的位置。
这是一个例子:
如果你的代码是一个实例方法里面,self是一个实例是的。换句话说,self是一个对象
获取我的终极Ruby秘籍表: 这个方便的7页PDF帮助您快速找到所需的Ruby语法,正在寻找的Ruby方法或您不太记得其名称的内置类。
您可以自己查看此操作。
运行此代码:
  1. def 咖啡
  2. 看跌期权自
  3. 结束
  4. 咖啡
  5. #主要
这段代码定义并调用了一个coffee打印的值的方法self
为什么打印main
因为它是顶级对象的名称,所以它是一个对象,您可以在其中找到在类外部定义的所有方法
就像coffee这里的方法一样。
但是,如果您在名为的类中定义了一个方法Cat,那么self它将是一个Cat对象。
如此处所示:
  1. 猫类
  2. 高清喵
  3. 看跌期权自
  4. 结束
  5. 结束
  6. 猫。新的。喵
  7. #<猫:0x7a14c5>
从这些示例中,我们可以看出self更改的值取决于您使用它的位置。
现在:
我相信您可以通过了解目的来更好地理解任何内容。
为什么self有用?
让我们看一些例子。

使用自我消除歧义

一种实际用途self是能够分辨出方法与局部变量之间的区别。
给变量和方法命名相同的想法不是一个好主意。但是,如果您必须处理这种情况,则可以使用调用该方法self.method_name
这就是我的意思:
  1. 类示例
  2. def do_something
  3. 香蕉= “变量”
  4. 放香蕉
  5. 看跌期权的自我。香蕉
  6. 结束
  7. def 香蕉
  8. “方法”
  9. 结束
  10. 结束
  11. 实例。新的。做一点事
  12. #“ variable” =>放香蕉
  13. #“ method” =>放置self.banana
这里bananado_something方法内部有一个局部变量,但也有一个banana方法。
局部变量优先。
这就是为什么self要调用该banana方法而不是打印banana变量值的原因,请在这里使用。
下一个:
让我们看一个更常见的用例……定义类方法!

使用自我定义类级方法

self毫无疑问,第一个用途是定义类级别的方法。
我敢肯定你看过他们。
这些def self.method_name方法的定义。
像这样一个:
  1. 色拉类
  2. 定义自我。buy_olive_oil
  3. #...
  4. 结束
  5. 结束
  6. 沙拉。buy_olive_oil
self相当于Salad类名。
为什么这有用?
因为我们不必为每个方法定义使用类名,所以如果更改类,则使我们的代码更易于更改。
这也使代码的噪音更少,更易于阅读。
这就是为什么我们做def self.buy_olive_oil的不是def Salad.buy_olive_oil

自我的其他用途

是!
的用途更多self,因此熟悉它会很有帮助。
例如:
您可以在一种方法中使用它来将当前对象与另一个对象进行比较。
像这样的东西:
  1. def == (其他)
  2. 自我==其他
  3. 结束
您也可以将其self用于调试目的,以查找正在使用的对象。
像这样:
  1. p 自我
或者,您可以将其用作返回值,以实现诸如Builder Design Pattern的设计模式
范例:
  1. 色拉类
  2. def 初始化
  3. @ingredients = [ ]
  4. 结束
  5. def add_nuts
  6. @ingredients << :坚果
  7. 结束
  8. 结束
  9. my_salad = 沙拉。新的。add_nuts
总而言之,这是对self有用的列表:
  1. 定义类级别的方法
  2. 当您具有相同名称的局部变量时,请使用实例方法
  3. 返回自我(构建者模式)
  4. 调试
  5. 比较对象(==)
  6. 方法调用的默认接收者

自我与自我

在完成本主题之前,我们应该看的另一件事。
Kernel#itself方法。
您可以在对象上调用此方法,然后该对象将返回自身。
范例:
  1. [ 1 ,2 ,3 ,零] 。选择(&:itself )
  2. #[1、2、3]
本示例过滤器nilfalse值。
了解差异:
  1. self是一个关键字。价值取决于您在哪里使用
  2. itself是一种方法。它的价值取决于什么对象,你使用它(中1.itself,1是对象)
希望对您有所帮助。

结论

您已经了解了Ruby self关键字,它的确切含义,为什么有用以及如何使用它。
现在轮到您尝试一下。
谢谢阅读!