ruby中各种变量作用域的区别

2023-11-22

Ruby 有 5 个变量作用域:

  1. 局部变量:这些是正常变量,例如x = 25, y = gaurish where x and y是局部变量。
  2. 实例变量:这些用@实际变量名前面的符号。主要与类一起使用,以便类的每个实例/对象都有不同/单独的值。例子。@employee.name = 'Alex'
  3. 类变量: 表示为@@变量名前面的符号。类变量,我认为所有实例/对象都具有相同的值。
  4. 全局变量:他们开始于$符号并且可以访问到处。例子$LOAD_PATH
  5. 常数:必须以大写字母开头,但按照惯例书写为ALL_CAPS。虽然它是一个常量,但它的值不是常量并且可以更改(尽管 ruby​​ 会抛出警告)。所以从某种意义上说,这也像一个变量。

正如您可能注意到的,以上所有都是存储某种类型的值的变量,并且它们的值可以更改。但是,每个范围的作用略有不同。有 5 种不同类型的变量作用域让我很困惑。主要是,我很难决定在什么情况下应该在代码中使用特定的范围。所以我心里有一些疑问。请回答:

  1. 我注意到,与实例变量不同,局部变量和类变量对于所有对象/实例都保持相同。那么局部变量和类变量有什么区别呢?
  2. 可以使用局部变量代替类变量吗?或相反亦然。如果是,那么为什么,如果不是,那么为什么不呢?
  3. ruby中的全局变量让我想起了万恶global $xPHP 中的变量。 ruby 中的全局变量是否也被认为是邪恶的,因此不应使用。或者,在某些特定情况下,在 ruby​​ 中使用全局变量是有意义的?
  4. 为什么常量不是常量并且允许其值改变?根据定义,常量的值应该是常量,对吧?否则,我们可以只使用另一个变量而不改变它的值。这相当于 ruby​​ 中的 CONSTANT 吗?
  5. 有任何页面/资源/链接解释了 ruby​​ 中 5​​ 个不同变量范围之间的区别吗?我喜欢随身携带一份以供参考。
  6. 在什么用例下,我应该在代码中使用特定的变量范围。所以有人会用例子来解释所有 5 个案例,这会很酷,这是我感到困惑的主要原因。
  7. 有没有像这样的事实上的选择public在java中?哪一个是安全的选择most用例?

感谢您抽出时间阅读并回答问题


  1. 类变量对于所有实例都是相同的,因为它们是与类相关联的类变量。所有事物都访问相同的变量,包括每个实例。

  2. 不,局部变量就是局部变量。它们可能是函数的局部变量,也可能是函数的局部变量类声明,即不同的而不是作为一个类变量。当类声明结束时,类声明中的局部变量将超出范围。

  3. 那是因为它们完全相同——它们是全球性的。全局状态是always邪恶的;这不是语言或环境的属性。也就是说,some可能需要全局状态——事情就是这样。当存在全局状态时,使用全局状态是有意义的。诀窍是使用全局状态properly,这有时是一项不平凡的努力。

  4. Ruby 就是这样。

  5. 克里斯已经给了一份。

  6. I would think这个问题很大程度上是自我回答的。当全世界都需要访问时,全球性。实例(当它特定于类实例时)。当仅在本地作用域中需要它时(例如,方法、块(注意 1.8 和 1.9 之间关于块作用域的差异)等),当变量不应该更改时为常量。类变量,当它是每个实例都需要的东西,或者如果通过类方法公开,则与类紧密相关的东西。

  7. 没有“大多数用例”,它完全取决于您对变量所做的事情。和public不是 Java 中事实上的选择——它取决于所讨论的实体。默认 Java 作用域是包私有的(方法、属性)。在 Ruby 中使用哪个完全取决于用例,请注意,与 Java 一样,在 Ruby 中甚至更容易,事情可以被规避。

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

ruby中各种变量作用域的区别 的相关文章

  • 类、模块、它们的特征类和方法查找

    我们来开公开课吧Module并向其中添加一个方法 class Module def foo puts phew end end 我可以通过这样做来调用这个方法 Class foo 这是可以理解的 因为类Class is Class 其超类是
  • Ruby 未绑定方法:是否可以强制绑定到其他类的实例?

    我想知道我是否可以强迫这种情况发生 class A def bomb bomb end end class B end bomb A instance method bomb b B new bomb bind b 目前它抛出错误 Type
  • Ruby 中多维数组的帮助

    我有以下代码将字符串拆分为 3 个字节的组 str hello ix 0 iy 0 bytes tby str each byte do c if iy 3 iy 0 bytes ix tby each index do i bytes i
  • 红宝石边缘情况

    ruby 有一些边缘情况很难解释 因为解析会带来一些有趣的问题 我在这里列出其中两个 如果您知道更多 请添加到列表中 def foo 5 end this one works if tmp foo puts tmp to s end How
  • 可以覆盖/实现的 ruby​​ 运算符列表

    是否有可以覆盖的所有 ruby 运算符的列表 不是那些不能的 Here s Ruby 运算符表 http phrogz net programmingruby language html table 18 4 方法和可重载的有 Elemen
  • 预期的 ProductField,出现数组问题

    我有一个 Rails 4 应用程序 它有一个如下所示的 params 块 def store params params require store permit name description user id products attr
  • 如何向 Time.now 添加两周?

    如何在 Ruby 中向当前 Time now 添加两周 我有一个使用 DataMapper 的小型 Sinatra 项目 在保存之前 我有一个字段填充了当前时间加上两周 但未按需要工作 任何帮助是极大的赞赏 我收到以下错误 NoMethod
  • yard 0.7.3 无法在 Markdown 和 Textile 中构建我的自述文件

    我决定将我的项目中的 README 文件转换为 Markdown 并一直使用yard 验证文档是否正确呈现 所以我安装了 rdiscount 将 README 更改为 README md 并尝试 yard doc README md 这给了
  • 如何从 Ruby 程序发送邮件?

    我想从 Ruby 应用程序发送电子邮件 核心语言中是否有调用来执行此操作 或者是否有我应该使用的库 最好的方法是什么 如果你不想使用行动邮递员 http wiki rubyonrails org rails pages ActionMail
  • 多重要求和允许强参数rails 4

    在下面的情况下 我尝试使用强参数 我想要求email address password并允许remember me fields 但像下面这样使用它只允许最后一行在方法示例中 在下面的情况下 它只需要params permit rememb
  • “rmagick”gem 安装问题

    我在尝试在 centos 上安装 rmagick gem 时遇到问题 以下是我得到的输出 谁能帮我识别一下我缺少什么包裹 我已经安装了所有提到的另一个堆栈溢出线程 RMagick安装错误 https stackoverflow com qu
  • Rails:named_scope、lambda 和块

    我认为以下两个是等效的 named scope admin lambda company id conditions gt company id company id named scope admin lambda do company
  • Ruby require 'file' 不起作用,但 require './file' 可以。为什么?

    我有一个充满 ruby 文件的文件夹 当我尝试使用位于同一目录中的另一个文件中的一个文件时require file 我得到一个LoadError但是当我使用require file 一切正常 有人可以向我解释为什么会发生这种情况吗 如果有什
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • 存根和 rspec 旧语法的问题

    我正在编写一些代码并使用 rspec 但收到警告 提示语法已过时 我不太清楚应该如何编写它 it should calculate the value correctly do mock cards Card new clubs 5 Car
  • 如何使用 net/http 验证 ruby​​ 中的 SSL 证书链

    我如何验证网站的证书 例如https processing ukash com https processing ukash com 在 ruby 中使用 net http https Net HTTP new processing uka
  • Ruby 是否有一个 Expect 等效 gem?

    Ruby 是否有一个 Expect 等效 gem 我尝试在 code google 和 ruby gems org 上搜索 但遗憾的是它没有出现 FYI Expect http en wikipedia org wiki Expect是一个
  • 使用rSpec 测试delayed_job 链的最佳方法是什么?

    目前 当我的代码中有一个延迟方法时 如下所示 CommentMailer delay deliver comments comment true 我在规范中写了这样的内容 dj mock DelayProxy CommentMailer s
  • Shoulda/RSpec 匹配器 - 条件验证

    在我的代码中 我使用 Shoulda 匹配器进行了以下验证 效果很好 it should validate presence of name 在我的模型中 我已将条件添加到验证中 validates presence of name if
  • 在 Sinatra 中运行后台进程

    我有 Sinatra Rails 应用程序和一个启动一些漫长过程的操作 通常我会为后台作业排队 但这种情况太简单了 后台进程很少启动 所以队列是一个开销 那么如何在没有队列的情况下运行后台进程呢 get build logs project

随机推荐

  • Razor HTML 条件输出

    我有一个要作为主内容输出的项目列表 下面不包括主内容 每个项目都有 3 个属性 部分名称 标签和值 每个项目都包含在 a 中 每次部分名称更改时 我都必须打开 a 并关闭前一个 如果有的话 我正在使用带有以下代码的 Razor 视图 for
  • 保存为表单中的文件

    使用 Canvas 方法 toDataURL 我希望能够将图像保存在服务器端 使用 Rails 有了 toDataURL 字符串 如何在 HTML 表单中可以将其视为文件附件的表单中使用它 使用 jQuery Paperclip dataf
  • Intl.DateTimeFormat 返回超过 24 小时

    我有以下 Unix 时间戳 1611328500000 Fri Jan 22 2021 10 15 00 GMT 0500 Eastern Standard Time 我需要以韩国标准时间显示它 为此 我正在使用Intl DateTimeF
  • 在 Chrome 中拦截对 console.log 的调用

    我有一个无法更改的脚本 它会产生很多console log来电 我想添加另一层并在调用包含某些字符串时进行响应 这在 Firefox 中有效 但会抛出 Illegal invocation Chrome 中第 4 行出现错误 var old
  • 在 ERB 块中的字符串内包含 ERB 分隔符

    我正在编写一个显示代码以及输出的样式指南 目前它的结构使得代码只需要描述一次 并以原始版本和解释版本显示 如下所示
  • C/C++ 中的简单虚拟文件系统

    我想实现一个非常简单的虚拟文件系统 VFS 它支持一些基本的文件系统操作 例如 fwrite fopen fput 等 VFS 是某些具体操作系统之上的抽象层 例如Windows Linux 等 现在假设 fopen 界面看起来像这样 FI
  • 为什么 ORACLE 不允许在命令中使用连续的换行符?

    I write CREATE TABLE Person name CHAR 10 ssn INTEGER 并将其保存到文件 a sql 如果我然后通过在 SQL Plus 命令提示符中键入 a 来运行它 它会告诉我以 ssn 开头的行不被识
  • 将项目添加到地图列表中的 Kotlin 惯用方式

    我有一个MutableMap
  • 如何使用 ggplot2 绘制具有 (x,y,r,g,b) 坐标的图像?

    我有一个数据框image rgb 我已将图像的每个坐标的 r g b 值加载到其中 使用jpeg and reshape包 现在看起来像 gt head image rgb y x r g b 1 1 1 0 1372549 0 12549
  • IdentityServer4在asp.net core中注册UserService并从数据库中获取用户

    我已经搜索了所有关于如何注册UserService在asp net core中使用IdentityServer4 但我似乎找不到正确的方法 这是找到的注册InMemoryUsers的代码here 但是我想访问我的 MSSQL DB 中的用户
  • UIWebView加载进度并调整网页以适应视图页面?

    我正在使用 UIWebView 加载网页 有3个问题 1 UIWebView加载页面时是否可以跟踪百分比进度 2 我注意到 当 Safari 加载网页时 URL 文本字段会显示一个蓝色背景进度指示器 告诉用户加载网页的百分比 这有什么技术
  • 使用 jQuery 插件设计模式调用方法

    我一直在使用 jQuery Boilerplate 来开发插件 但我不明白的一件事是如何从插件外部调用方法 作为参考 这里是我正在讨论的样板代码 http jqueryboilerplate com 在我的小提琴中 http jsfiddl
  • FormData.append("key", "value") 不起作用

    你能告诉我这有什么问题吗 var formdata new FormData formdata append key value console log formdata 我的输出看起来像这样 我找不到我的 键 值 对 FormData p
  • 检查指针是否分配了内存

    在 C 中 我们可以检查传递给函数的指针是否分配了内存吗 我用 C 语言编写了自己的函数 它接受字符指针 buf 指向缓冲区的指针 和大小 buf siz 缓冲区大小 实际上 在调用此函数之前 用户必须创建一个缓冲区并为其分配 buf si
  • 有谁知道 IOS 6.0 中不推荐使用哪些方法?

    有谁知道有多少种方法已弃用的 IOS 6 0 例如 1 shouldAutorotateToInterfaceOrientation iOS 6 0 中已弃用 而是使用 shouldAutorotate 2 dismissModalView
  • 如何在 Shiny 中使用自己的一组小部件创建多个页面

    我希望能够创建多个页面 每个页面都有一组小部件下拉列表 单选按钮和一个用于绘制地图的空间 Shiny 教程展示了如何创建多个页面 shinyUI navbarPage My Application tabPanel Component 1
  • 多线程单读单写fifo队列

    我需要一个队列来将消息从一个线程 A 传递到另一个线程 B 但是我无法找到真正执行我想要的操作的队列 因为它们通常允许添加项目失败 在我的情况下就是这种情况这几乎是致命的 因为消息需要处理 并且线程确实无法停止并等待空闲空间 只有线程 A
  • 自签名证书可以在 Apache 反向代理后面工作吗?

    我们希望使用 Apache 作为一组应用程序服务器的反向代理 我们计划在 Apache 实例上使用 CA 签名的 SSL 证书 但希望在应用程序服务器实例上使用自签名证书 以便 Apache 到应用程序服务器的连接也被加密 如果不需要 我们
  • 重写方法中的变量名称不正确

    当我让 Android Studio 生成覆盖方法时 它将生成具有奇怪参数名称的方法 例如根据文档 onCheckedChanged 应该如下所示 public void onCheckedChanged CompoundButton bu
  • ruby中各种变量作用域的区别

    Ruby 有 5 个变量作用域 局部变量 这些是正常变量 例如x 25 y gaurish where x and y是局部变量 实例变量 这些用 实际变量名前面的符号 主要与类一起使用 以便类的每个实例 对象都有不同 单独的值 例子 em