如何使用Ruby的self关键字

2023-12-25

据我了解self,它指的是该类的当前实例。

无论如何,这不是始终的默认行为吗?例如,不是

self.var_one = method(args)

相当于

var_one = method(args) 

如果是的话有什么用self?


有几个重要的用途,其中大部分基本上是为了消除实例方法、类方法和变量之间的歧义。

首先,这是定义类方法的最佳方式:

class Foo
  def self.bar
    "class method bar"
  end

  def bar
    "instance method bar"
  end
end

Foo.bar  #returns "class method bar"

foo = Foo.new
foo.bar #returns "instance method bar"

另外,在实例方法中self指的是实例,在类方法中它指的是类,并且它总是可以用来与局部变量区分开。

class Bar
  def self.foo
    "foo!"
  end

  def baz
    "baz!"
  end

  def self.success
    foo #looks for variable foo, doesn't find one, looks for class method foo, finds it, returns "foo!"
  end

  def self.fail
    baz #looks for variable baz, doesn't find one, looks for class method baz, doesn't find one, raises exception
  end

  def instance_success
    baz #looks for variable baz, doesn't find one, looks for instance method baz, finds it, returns "baz!"
  end

  def instance_fail
    foo #looks for variable foo, doesn't find one, looks for instance method foo, doesn't find one, raises exception
  end

  def local_variable
    baz = "is my favorite method"
    baz #looks for variable baz, finds it, returns "is my favorite method"
  end

  def disambiguate
    baz = " is my favorite method"
    self.baz + baz #looks for instance method baz, finds it, looks for local variable baz, finds it, returns "baz! is my favorite method"
  end
end

所以,最后,你可以避免使用self在许多情况下,但使用它通常会很有帮助,以确保您以后不会无意中造成命名冲突。有时,这些可能会产生很难发现的错误。最终,这通常是个人风格的问题。


正如评论中指出的,还有一件非常重要的事情:

在一个类中,如果你有这样的方法:

def bar=(string)
  ...
end

在另一种方法中,您调用:

def other_method
  bar = "abcd"
end

它不会打电话给你bar=方法,它将创建一个局部变量bar。所以,在这种情况下你使用self告诉 Ruby 不要创建局部变量:

def other_method
  self.bar = "abcd"
end

如果您想使用方法名称作为参数,同样的情况也适用:

def example
  ...
end

def other_thing(example)
  self.example(example)
end

如果你离开了selfRuby 会假设您指的是同名的局部变量。

所以,一般来说,self方法名称中用于区分类变量和实例变量,当 Ruby 需要帮助区分方法调用和局部变量或局部变量赋值时,在其他任何地方都可以使用它。

我希望这是有道理的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Ruby的self关键字 的相关文章

  • ActiveAdmin:按子对象计数过滤

    在严重依赖 ActiveAdmin 的 Ruby on Rails 应用程序中 我有一个赞助商模型 它与赞助商模型关联 一sponsor可以资助很多孩子 所以一个sponsor可以有很多sponsorships 我想做的是能够在赞助商索引页
  • 将 XML 转换为带属性的 ruby​​ 哈希

    客观的 将 XML 转换为 ruby Hash 包含所有节点和属性值 我尝试了什么 xml
  • Ruby on Rails 3:Devise::LdapAdapter.get_ldap_param 未定义方法错误

    我在跑步 红宝石 1 9 3p0 轨道 3 1 1 设计1 4 9 Devise ldap authenticatable 0 4 10 我正在使用 Devise 通过 LDAP 服务器验证我的 Rails 应用程序 我使用用户名而不是电子
  • 命令行 Ruby 函数的手册页

    有没有办法从命令行获取 Ruby 函数的手册 像 funcR 中的手册页 The ri工具在这里可能会有所帮助 http rubylearning com satishtalim ruby ri tool html ri Array ri
  • Rails 开发服务器、PDFKit 和多线程

    我有一个 Rails 应用程序 它使用 PDFKit 来呈现网页的 pdf 版本 我使用 Thin 作为开发服务器 问题是当我处于开发模式时 当我使用 bundle execrails s 启动服务器并尝试渲染任何 PDF 时 整个过程陷入
  • 无法在 Eclipse 4.2 上安装 Aptana 插件

    我已经安装了 Eclipse 4 2 Juno 现在我想安装 aptana 来开发 ruby 但出现以下错误 无法读取存储库http download aptana com studio3 plugin install content ja
  • 动态获取路由路径

    我最近将一些模板从 ERB 转换为 Haml 大多数情况下 它变得更干净 更好 但按钮定义开始变得糟糕 我想转换这个 link to t new default gt t helpers links new new intern path
  • 验证 Rails 中多个属性之一是否存在

    在多语言应用程序中 用户可以输入自己的中文和英文姓名 用户可以输入其中之一或两者 但必须至少输入一个名称 class Person lt ActiveRecord Base validates zh name presence gt tru
  • 如何在 Ruby 中获取从位置 N 到最后一个字符的子字符串?

    我想从字符串中获取从位置 N 到字符串末尾的子字符串 在 Ruby 中如何做到这一点 只需将字符串切片即可 string N 1
  • 如何调用 ActiveRecord 验证器作为实例方法(ala Sequel)?

    我有一个模型 根据其当前状态需要不同的验证器 我应该如何为每个实例调用 ActiveRecord 验证器 我想尽可能多地重复使用管道 但我不知道如何继续 class Order lt ActiveRecord Base attr acces
  • simple_form 中的嵌套属性返回批量赋值错误

    Models class Topic lt ActiveRecord Base has many posts dependent gt destroy validates name presence gt true length gt ma
  • 设备中的嵌套资源

    我是 Rails 新手 我想要一些关于我的路线和正确的路由逻辑的建议 我正在开发一个非常简单的应用程序 用户可以在其中发布列表 用户 设计模型 有很多列表 并且该列表属于一个用户 我的列表中有一个 user id integer 当用户成功
  • 如何在 Ruby 中将…(省略号)更改为…(三个句点)?

    我正在解析这个文件 http msdn microsoft com en us library ms189782 aspx using nokogiri 我发现有一些 省略号 该页面中的字符且无法删除 我想知道如何用Ruby来替换所有 省略
  • Hstore 和 Rails

    我正在尝试使用最新版本的 activerecord postgres hstore gem 在 Rails 3 2 9 项目中使用 Hstore 但在使用 ActiveRecord 提供的 store accessor 来获取 Hstore
  • 编译资产时“堆栈级别太深”

    运行后brew upgrade 或者其他更新了我的 gems ruby 版本的东西 我的rake assets precompile任务不再有效 我收到此错误 rake aborted stack level too deep in Use
  • “修补”rails 渲染函数来编辑默认选项

    当我在 Rails 中渲染 xml 时 我总是想要 dasherize gt false 选项 有没有办法将其设置为应用程序范围的默认值 当然无需修改 Rails 源代码 也许一个渲染函数以某种方式优先于第一个函数 然后使用此选项调用它 这
  • 为什么数组前需要加星号?

    我不知道这是哈希问题还是数组问题 但我不明白为什么第三个示例中需要星号 才能获得填充数据的哈希 如果没有它 它会输出一个空的哈希值 coding utf 8 require pp pp first name Shane last name
  • 为什么 Ruby 解析文件时常量不像局部变量那样被初始化?

    在 Ruby 中 我知道我可以做这样的事情 if false var Hello end puts var 应用程序不会崩溃 并且var只需设置为nil 我读到 这种情况的发生是由于 Ruby 解析器的工作方式造成的 为什么同样的方法不适用
  • 当字符串太长时截断

    我有两个字符串 short string hello world long string this is a very long long long string suppose more than 10000 chars 我想改变默认行为
  • 删除记录时出现SystemStackError(堆栈级别太深)

    删除记录时出现 Stack Overflow 错误 SystemStackError 堆栈级别太深 应用程序 控制器 orders controller rb 18 在 销毁 中 我发现了另一个与 ruby 相关的系统堆栈错误 但我没有完全

随机推荐

  • 为什么 Git 会在没有询问我的情况下记住并使用中止的 rebase 中的冲突解决方案?

    我对我的分支做了变基foo git rebase master 做了一些冲突解决方案 然后决定我不想这样做 然后中止 git rebase abort 所有分支日志历史看起来都很正常 现在我想再次开始相同的过程 git rebase mas
  • OnClick 事件对列表视图项目重复

    我的应用程序中有一个列表视图 每个列表视图行都会在点击时展开 并且隐藏视图变得可见 但问题是隐藏视图对于列表中的许多其他项目也变得可见 我知道这种行为的原因 但不知道如何解决 这是我的适配器类 public class ScheduleTa
  • 即使没有断点,Chrome 调试器也会暂停?

    检查此站点时 即使没有设置断点 脚本也始终在调试器中暂停 并且如果暂停未暂停 它会再次自行暂停 可以做什么 https i stack imgur com J84eU png https i stack imgur com J84eU pn
  • SELECT MAX 返回错误值

    我有一个 SQL 数据库 其中有一个名为premisis 我希望选择最高的行premisisnumber 这是我正在使用的 SQL SELECT max premisisnr AS premisisnr FROM premisis 问题是
  • 真正的path.py请站起来吗?

    有一个很好的模块 path py 由贾森 奥伦多夫撰写 如果我没记错的话 曾经有过一些关于将其添加到标准库的讨论 然后就消失了 现在看来 原来的产物有多种衍生产物 到目前为止我能找到unipath http pypi python org
  • AWS Beanstalk 在部署 Nodejs 应用程序时如何使用 NPM?

    我对 AWS Beanstalk 部署的整体工作流程感到好奇 我假设它在某个时刻运行 npm 来将软件包安装在服务器上 但我只是想知道 AWS Beanstalk 是否使用最新的 npm install product 命令来安装软件包 目
  • NAT 后面的 UDP 打洞

    我正在尝试用 Java 实现 UDP Holepunching 的简单草图来测试它的概念 并稍后在我的 C C 应用程序中使用它 Concept 根据维基百科 我对这个概念的理解是这样的 假设 A 和 B 是未定义网络结构后面的客户端 C
  • Firebase Angular 4基于节点环境初始化

    我已经使用 Angular CLI 构建了 Angular 4 项目 我正在 Heroku 上部署我的应用程序 我已经为开发和生产环境创建了 heroku 管道 我有两个 Firebase 数据库开发和生产 我希望我的 Angular 2
  • 从 JBoss EAP 6.1 中排除 JPA 子系统 - 尝试在 JBoss EAP 6.1 中使用 JPA 2.1

    我有一个 war 应用程序 其中包含使用 Spring 容器打包和引导的 JPA 2 1 API 和 Hibernate 4 3 0 Final JPA 2 1 实现 我想将其部署在 JBoss EAP 6 1 中 我知道 JBoss EA
  • 是否可以修改 Service Worker 缓存响应标头?

    我正在尝试标记存储在服务工作线程缓存中的资源 我认为可以向资源添加一个自定义标头来表明这一点 但是 一旦资源存储在服务工作线程缓存中 标头修改似乎就会被删除 是这样吗 我没有看到任何内容缓存规范 https www w3 org TR se
  • 再次显示相同的 AlertDialog

    我正在测试 AlertDialog 的行为以集成到更大的组件中 我无法再次显示相同的对话框 这是测试代码 public class MainActivity extends AppCompatActivity private AlertDi
  • 返回 id 并分割逗号分隔值的 SQL 语句

    我有一个包含以下数据的表 NodeId ExternalIds 50 601 56 700 701 如何编写分割ExternalIds列并返回的SQL语句 NodeId ExternalIds 50 601 56 700 56 701 我发
  • Google 日历活动的正确日期格式

    我正在尝试为 Google 日历创建活动 但收到此错误 Invalid value for T found can only parse bare date string 2013 08 22T16 00 00 我还尝试将时区偏移添加到我的
  • 在 WordPress 的父帖子页面上显示子帖子

    我们当前的网站使用带有父 子帖子的自定义帖子 查看 父 帖子时 会使用插件来拉取其子帖子 并将这些子帖子显示在页面上的选项卡中 我们现在在多个网站上使用该自定义主题的新版本 并且不再使用父 子关系 相反 我们在自定义帖子类型中有元框 所有附
  • 最佳且简单的数据结构

    我正在尝试在 vb net 中创建以下矩阵 以便在处理过程中我可以获得字母表的匹配分数 例如 A 和 N 的匹配是什么 我将查看我的内置矩阵并返回 2 同样 P 和 L 的匹配是什么 我将查看我的内置矩阵并返回 3 请建议我如何去做 我试图
  • 安装apk时不显示权限

    我正在使用 FlashBuilder 使用 ActionScript 制作 Android 应用程序 我需要为我的应用程序使用 WiFi 权限 该应用程序在桌面上运行没有任何问题 AIR 桌面项目 现在 当我尝试为 Android 移动项目
  • Facebook python 营销 API AttributeError

    我正在尝试通过其 python 包 facebookapi 使用 Facebook Marketing API 这是一个代码片段 from facebookads adobjects customaudience import Custom
  • Google Classroom API 修改附件

    当执行courses courseWork studentSubmissions modifyAttachments方法 当我尝试将附件添加到学生提交的内容时 返回 403 错误 GoogleJsonResponseException co
  • ImageMagick:使用最大文件大小缩放 JPEG 图像

    我有一些 JPEG 图片 我想将它们缩小 另一个要求是文件大小不应大于 300kByte 这可能吗 请帮我举个例子 要将生成的图像限制为最大文件大小 可以使用命令行参数 define jpeg extent max value 像这样 co
  • 如何使用Ruby的self关键字

    据我了解self 它指的是该类的当前实例 无论如何 这不是始终的默认行为吗 例如 不是 self var one method args 相当于 var one method args 如果是的话有什么用self 有几个重要的用途 其中大部