如何在 Ruby 中使用全局变量或常量值?

2024-05-06

我有一个看起来像这样的程序:

$offset = Point.new(100, 200);

def draw(point)
  pointNew = $offset + point;
  drawAbsolute(point)
end

draw(Point.new(3, 4));

指某东西的用途$offset似乎有点奇怪。

在 C 中,如果我在任何函数之外定义某些内容,它会自动成为全局变量。为什么在 Ruby 中它必须是$offset但不能是offset并且仍然是全球性的?如果是offset,那么它是本地的吗?但它是本地化的,因为它感觉非常全球化。

上面的代码有更好的写法吗?指某东西的用途$offset乍一看可能有点难看。


更新:我可以把这个偏移量放在一个class定义,但是如果两个或多个类需要使用这个常量怎么办?在这种情况下我还需要定义一个$offset?


Ruby 中的变量范围在某种程度上是由 sigils 控制的。变量开头为$是全局的,变量具有@是实例变量,@@表示类变量,以大写字母开头的名称是常量。所有其他变量都是本地变量。当您打开一个类或方法时,这是一个新的作用域,并且先前作用域中可用的局部变量不可用。

我通常更喜欢避免创建全局变量。有两种技术通常可以达到相同的目的,我认为这两种技术更干净:

  1. 在模块中创建一个常量。因此,在这种情况下,您可以将所有需要偏移量的类放入模块中Foo并创建一个常数Offset,这样所有的类都可以访问Foo::Offset.

  2. 定义一个方法来访问该值。您可以全局定义该方法,但同样,我认为最好将其封装在模块或类中。这样,数据就可以在您需要的地方使用,您甚至可以根据需要更改它,但程序的结构和数据的所有权将更加清晰。这更符合OO设计原则。

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

如何在 Ruby 中使用全局变量或常量值? 的相关文章

随机推荐

  • Amazon S3 无法通过 Cloudfront 上传文件

    我想通过 Cloudfront 使用签名 URL 将文件上传到 S3 Cloudfront 行为中允许 HTTP PUT 桶策略 Sid 2 Effect Allow Principal AWS arn aws iam cloudfront
  • 从内存中获取Java类字节码(经过多次转换)

    我正在为 Minecraft 开发一个 coremod 并在加载许多类时对其进行转换 然而问题是 有多个 coremod 也转换了与我相同的类 并且我遇到了一些我想研究的奇怪行为 那么问题来了 经过多次转换后的字节码如何检查呢 当我转换它时
  • Azure DevOps/VSTS 始终在干净的存储库上报告“DETACHED HEAD”

    Friends 我现在厌倦了 Azure DevOps VSTS Jenkins 好多了 现在仍然如此 只是我的组织想要使用 Azure DevOps 我有一个谜团需要帮助来解决 以下是我的笔记本电脑上的存储库 它没有未跟踪或未提交的更改
  • 如何使用 Moq 模拟 Web 服务调用?

    The using下面点击了我不想实际点击的外部资源 我想测试someResult以及使用它的代码 但每次我运行单元测试时 该代码仍然尝试访问真正的 Web 服务 如何使用最小起订量来伪造对 Web 服务的真实调用 但不模拟使用中的其余代码
  • matplotlib 轴标签偏移量的因素和变化

    在 matplotlib 中的轴刻度标签上 有两种可能的偏移量 factors and shifts 在右下角 1e 8 是一个 因子 1 441249698e1 是一个 移位 这里有很多答案展示了如何操纵两个都 matplotlib 将轴
  • Android EditText:在触摸时选择所有文本,并在用户开始输入时清除。

    我的应用程序中有一个编辑文本 当用户触摸编辑文本时 应选择整个文本 而当他开始输入文本时 应清除文本 一个例子是浏览器地址栏 有什么办法可以做到这一点吗 请帮助我 您可以使用以下方法选择 EditText 中的所有文本 android se
  • 删除核心数据中的对象

    我的核心数据模型中有一个实体 如下所示 interface Selection NSManagedObject property nonatomic retain NSString book id property nonatomic re
  • 如何BSWAP 64位寄存器的低32位?

    我一直在寻找如何将 BSWAP 用于 64 位寄存器的低 32 位子寄存器的答案 例如 0x0123456789abcdef位于 RAX 寄存器内 我想将其更改为0x01234567efcdab89用一条指令 因为性能 所以我尝试了以下内联
  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include
  • iOS 中的随机颜色

    我想让我的导航栏每次加载时都具有不同的颜色 我在 viewDidApear 中放置了以下代码 CGFloat hue arc4random 256 256 0 0 0 to 1 0 CGFloat saturation arc4random
  • JQuery 从 Div 中抓取文本减去子元素[重复]

    这个问题在这里已经有答案了 有没有一种简单的方法可以从这个 div 中获取文本而不获取任何子元素 div strong Title Text Unwanted strong This is the text I need div 我知道我可
  • Chrome 无法识别我对 javascript 文件的更改并加载旧代码?

    我在这里坐了将近一个小时来测试我正在构建的网站 由于我想查看代码中的新更改 因此我重新加载了代码 但它正在重新加载旧代码 我打开了 devetools 进行硬重新加载和清空缓存硬重新加载 它们都加载我的旧代码 我进入隐身模式 它做了同样的事
  • 检测 Android 中 OSM Mapview 是否仍在加载

    我已将 Open Street Maps 包含在我的 Android 应用程序中 在地图视图中 用户应该能够在地图完全加载后捕获屏幕 但目前 即使地图视图仍在加载 用户也可以捕获图像 有人可以告诉我如何检测地图视图何时完全加载吗 下面是我加
  • 将 dataGridView 绑定到绑定列表并按文本框过滤行

    我正在开发一个 Winforms 应用程序 并且有一个已经绑定到 dataGridView 的对象的 BindingList 我还有一个 过滤器 文本框 如果它们与文本框文本不匹配 我想从 datagridview 行中过滤掉行 我想以某种
  • 更改 RabbitMQ 队列中的参数

    我有一个 RabbitMQ 队列 最初声明如下 var result channel QueueDeclare NewQueue true false false null 我正在尝试添加死信交换 因此我将代码更改为 channel Exc
  • 从字符串渲染 React 组件

    我在字符串中有一些 React 代码 例如 const component function App return div test div 我希望能够从浏览器内渲染该组件 例如 import React Component from re
  • 如何使用 Solr 索引 pdf 内容?

    我正在尝试使用 SolrJ 索引一些 pdf 文档 如下所述http wiki apache org solr ContentStreamUpdateRequestExample http wiki apache org solr Cont
  • 如何测试抽象类的受保护抽象方法?

    我一直在研究测试名为的抽象类的最佳方法TabsActionFilter 我保证继承自的类TabsActionFilter将有一个名为GetCustomer 在实践中 这种设计似乎效果很好 我遇到的一些问题是弄清楚如何测试OnActionEx
  • 如何在 Mac OS X 上的 postgres 中安装 tablefunc?

    我使用 StackBuilder 在我的 Mac OS X 计算机上安装 Postgres 9 2 现在需要使用tablefunc 貌似该功能不可用 如何在 Mac 上安装 contrib 包 正如 a horse with no name
  • 如何在 Ruby 中使用全局变量或常量值?

    我有一个看起来像这样的程序 offset Point new 100 200 def draw point pointNew offset point drawAbsolute point end draw Point new 3 4 指某