Ruby - 实例方法:为什么我可以使用没有 self 的 getter,但只能使用 self 的 setter

2024-01-25

我使用 Ruby 一段时间了。现在我要更深入地挖掘并找到我所遇到的问题的所有答案。 我希望我能在这里找到这个问题的答案。所以这是我在下面的代码中的问题:

class Game

  attr_accessor :in_progress

  def initialize
    @in_progress = false
  end

  def start!

    # debug info                                                                         
    puts self.inspect                        # => #<Game:0x8f616f4 @in_progress=false>
    puts self.class.instance_methods(false)  # => [:in_progress, :in_progress=, :start!]
    puts self.instance_variables             # => [:@in_progress]
    puts self.respond_to?("in_progress=")    # => true

    puts in_progress      # => true - getter works without self
    # main quesion
    in_progress = true    # Why setter doesn't work without self?

    # self.in_progress = true   # this would work and set @in_progress to true becase setter called
    # @in_progress = true       # this would work as well because we set instance variable to true directly

  end

end

g = Game.new
g.start!
puts g.in_progress # => false - setter in start! method didn't work

我们这里有什么:

  1. 带有 @in_progress 变量的 getter 和 setter 的类游戏
  2. @in_progress 默认为 false
  3. 我们叫开始!方法并尝试将 in_progress 更改为 true
  4. in_progress 的 Getter 效果很好
  5. Setter 只与 self 一起工作。或者通过@in_progress直接访问变量

我读到有关 Ruby 中的方法查找的内容(向右一步进入接收者的类,然后沿着祖先链向上,直到找到该方法。) 但我真的不知道为什么我必须使用 self.in_progress=true 来访问 setter 方法。特别是当 getter 方法在没有 self 的情况下工作时。

提前致谢!


因为您正在为局部变量赋值in_progress在函数中,而不是实例变量中。 getter 起作用是因为 Ruby 将查询该对象的本地命名空间start!函数为in_progress,它不会找到它,然后它会查询实例命名空间,它会找到一个名为的方法in_progress并会调用它。

Ruby 解释器无法确定您是否要分配true在当地的价值in_progress或者在实例变量上,所以规则是在本地分配它(到当前命名空间start!).

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

Ruby - 实例方法:为什么我可以使用没有 self 的 getter,但只能使用 self 的 setter 的相关文章

  • 从类内部调用属性访问器方法[重复]

    这个问题在这里已经有答案了 我正在尝试调用我的类属性编写器之一 但由于某种原因它永远不会被调用 下面是一些代码 可以使这一点更清楚 class Test attr reader test def test val puts Called t
  • Rails 3 - “无法解析 Yaml”

    我不知道我做错了什么 我尝试运行 rails c 但它只是给了我一个错误 10 分钟前它还在工作 C Ruby192 lib ruby 1 9 1 psych rb 148 in parse couldn t parse YAML at l
  • 在 Mac OS X 10.6.8 中手动编译 Ruby 时,GEM 在哪里?

    我在 Snow Leopard 上手动构建了 Ruby 1 9 2 现在我找不到我的旧 GEM 文件了 我猜他们现在正走在不同的道路上 所以我有三个问题 什么是 旧 宝石路径 在哪里gem install sinatra把西纳特拉宝石 当我
  • Ruby gem 环境问题 - LoadError: no such file to load -- robots

    我正在尝试使用 anemone gem 编写一个爬虫 这需要 robots gem 不管出于什么原因 机器人绝对不会包括在内 这是我的一些环境信息 gem list d robots LOCAL GEMS robots 0 10 1 Aut
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • rspec 中的模拟方法链

    有一系列方法可以获得user目的 我试图模拟以下内容以返回user in my Factory Girl current user AuthorizeApiRequest call request headers result 我可以模拟该
  • Ruby 的 Faraday - 多次包含相同的参数

    我正在使用一个 API 该 API 迫使我多次发送相同的参数名称以级联不同的过滤条件 因此 示例 api GET 调用如下所示 GET http api site com search a b1 a b2 a b3 a c2 我使用 Far
  • 从 Jekyll 插件向页面添加属性

    假设我想要一个包含如下内容的页面 h1 page comment count Comment s h1 for c in page comment list div strong c title strong br c content di
  • 一对一的DataMapper关联

    我对 DataMapper 非常陌生 我正在尝试为以下场景创建模型 我有许多用户 有用户名 密码等 他们也可以是玩家或裁判员或两者兼而有之 因此单表继承不是一个选项 基本模型是 class User include DataMapper R
  • 何时使用node.js、sinatra、rails? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这 3 种语言 框架的最佳用途是什么 混合所有 或 2 个 有用吗 如果您正在构建一个完整的 Web 应用程序 您可能应该使用 Rails 因为
  • 如何在 Ruby 中动态调用访问器方法[重复]

    这个问题在这里已经有答案了 不管这是否是好的做法 我如何在 Ruby 中动态调用访问器方法 这是一个示例类 class Test Class attr accessor a b end 我可以使用 Object send 方法来读取变量 i
  • HMC SHA1 哈希 - C# 生成与 Ruby 不同的哈希输出

    我正在尝试为我正在使用的第三方服务快速获取一个有缺陷的 Net 客户端库 原始库 可以运行 是用 Ruby 编写的 但 DotNet 的等效库会向 Ruby 库生成不同的哈希输出 Ruby加密代码如下 def self encrypt st
  • 未知属性:user_id

    我在执行 current user stories build 期间收到错误未知属性 user id class User lt ActiveRecord Base has many stories class name Story for
  • RSpec 2 中使用 OR 相等

    下面这个例子的正确写法是什么 玩家的分数应等于 5 或 8 it should equal 5 or 8 do player score should 5 or 8 end Thanks Tim 5 or 8将始终产生结果 5 并且不会执行
  • Rails 递归地包含 javascripts 资源文件夹

    我了解如何将一个 JavaScript 文件添加到 Rails 资产管道中 只需添加 require filename 到 application js 但是如何在一个文件夹下包含多个 javascript 文件 vendor assets
  • 对范围值进行排序

    我想对表示数值范围的字符串数组进行排序 如下所示 b 0 5 100 250 5 25 50 100 250 500 25 50 使用sort我得到的方法 b sort gt 0 5 100 250 25 50 250 500 5 25 5
  • 如何从数组中提取特定元素?

    如果我有一个数组a 1 2 3 4 5 6 7 8 9 10 我想要这个数组的一个子集 第 1 个 第 5 个和第 7 个元素 是否可以通过简单的方式从该数组中提取这些内容 我在想这样的事情 a 0 4 6 1 5 7 但这行不通 还有一种
  • 我应该如何使用 alias_method_chain 作为构建方法?

    我正在使用 Ruby on Rails 3 2 13 我想正确使用alias method chain build option name声明 因为我收到一个奇怪的错误 那是 在我的控制器文件中我有 class Articles Comme
  • rake db:migrate db:reset 和 db:schema:load 之间的区别

    和 之间的不同rake db migrate and rake db reset我很清楚 我不明白的是如何rake db schema load与前两者不同 只是为了确保我在同一页面上 rake db migrate 运行尚未运行的迁移 r
  • 查找 Rails 应用程序中未使用的代码

    如何查找正在运行和未运行的代码生产中 该应用程序经过充分测试 但还有很多测试unused代码 因此 他们在运行测试时得到覆盖 我想重构并清理这个烂摊子 它一直在浪费我的时间 我有很多后台工作 这就是为什么我希望生产环境来指导我 在 Hero

随机推荐