新手入门:ruby 中的实例变量?

2024-03-04

请原谅这个新手问题,但为什么 @game_score 总是为零?

#bowling.rb

class Bowling
  @game_score = 0
    def hit(pins)
        @game_score = @game_score + pins
    end

    def score
        @game_score
    end
end

让我们看一下代码,好吗?

#bowling.rb

class Bowling
  @game_score = 0 # (1)

此时(1),我们仍然处于class Bowling。请记住:类与其他对象一样只是对象。所以,此时您正在分配0到实例变量@game_score 类对象的Bowling.

 def hit(pins)
  @game_score = @game_score + pins # (2)

现在(2),我们在一个实例方法 of the Bowling班级。即:这是一个属于instance of Bowling。所以,现在实例变量@game_score属于instance of the Bowling类,而不是类本身。

Since this实例变量从未被初始化为任何内容,它将计算为nil(在 Ruby 中,未初始化的变量总是计算为nil),因此计算结果为@game_score = nil + pins自从nil没有#+方法,这将导致NoMethodError引发异常。

 end
 def score
  @game_score # (3)

在这里(3),我们再次处于一个实例方法 of the Bowling班级。这将始终评估为nil,出于我上面概述的原因:@game_score从未初始化,因此它的计算结果为nil.

 end
end

我们可以利用Ruby的反射能力来看看到底发生了什么:

p Bowling.instance_variable_get(:@game_score) # => 0
b = Bowling.new
p b.instance_variable_get(:@game_score) # => nil

现在让我们向实例变量注入一个值:

b.instance_variable_set(:@game_score, 1)
p b.score # => 1
b.hit(3)
p b.score # => 4

因此,我们看到一切都按预期工作,我们只需要弄清楚如何确保实例变量得到初始化。

为此,我们需要编写一个初始化方法。奇怪的是,初始化方法实际上是私有的实例方法 called initialize。 (之所以initialize是实例方法而不是类方法,实际上很简单。 Ruby 将对象创建分为两个阶段:内存分配和对象初始化。内存分配是由一个class方法称为alloc对象初始化是由instance方法称为initialize。 (Objective-C 程序员会认识到这一点。)原因alloc是一个类方法只是因为此时执行中还没有实例。而原因是initialize是一个实例方法,对象初始化显然是每个对象的。为了方便起见,有一个标准工厂类方法称为new这两个都调用alloc and initialize为你。)

class Bowling
 def initialize
  @game_score = 0
 end
end

让我们测试一下:

c = Bowling.new
p c.score # => 0
c.hit(2)
p c.score # => 2

顺便说一句:只是一些小的 Ruby 风格提示:缩进是 2 个空格,而不是 1 个制表符。和你的hit更惯用的方法是@game_score += pins.

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

新手入门:ruby 中的实例变量? 的相关文章

  • Ruby 中 return 的意义是什么?

    有什么区别return只需放置一个变量 如下所示 没有回报 def write code number of errors if number of errors gt 1 mood Ask me later else mood No Pr
  • 如何访问 IRB 中所需的 Ruby 文件中定义的变量?

    文件welcome rb包含 welcome message hi there 但在 IRB 中 我无法访问刚刚创建的变量 require welcome rb puts welcome message gt undefined local
  • Ruby Shoes 打包程序,包括应用程序中的 Shoes

    我似乎无法让 Ruby Shoes 打包程序正确创建包含 Shoes 的 exe 我正在使用 Raisins 版本 0 r1134 并从 github 替换 pack rb 打包程序制作的 exe 都是 70 80K 文件 它们显然不包括
  • Ruby on Rails:有条件地显示部分内容

    我不确定我在这里是否采用了最好的方法 但我有一个数据块 我想在搜索完成后显示它 并且之前根本不存在 首先 没有什么可显示的 其次它引用的模型为零 因此它抛出异常 我将此块放置在部分模板中 并将其添加到布局中的适当位置 有没有办法有条件地干净
  • Sinatra 启用:会话不适用于乘客/apache

    我在启用 sessions 时遇到问题 以维持在 guest apache 上托管的简单 Sinatra 应用程序 我将会话 authorized 的状态存储在cookie 中 当托管在 Rack Handler Mongrel 上时 它可
  • 用 ruby​​ 中的数组内容替换字符串?

    String Test string Test array link1 link2 如何替换这样的字符串 输出应该是String link1 string link2 字符串 gsub 可以返回一个枚举器 所以这很简单 string gsu
  • MacOS 每秒唤醒次数错误

    构建 Rails 应用程序 ruby 2 4 0p0 Rails 5 1 4 并使用我的 Macbook Air MacOS High Sierra 10 13 2 进行本地测试 我不断遇到此问题 过去 241 秒内有 45001 次唤醒
  • 如何运行使用 Rails 模型的 Ruby 任务?

    我有一个带有一些基本模型的 Rails 应用程序 该网站显示从其他来源检索到的数据 因此 我需要编写一个 Ruby 脚本来在数据库中创建新实例 我知道我可以使用测试挂钩来做到这一点 但我不确定这在这里是否有意义 我不确定这个任务应该是什么样
  • Riod-iOS 错误:您没有写入权限“Gem::FilePermissionError”

    我已经下载了一个Riot iOS https github com vector im riot ios并遵循构建说明 当我跑步时 捆绑安装 回溯 最近一次调用 2 来自 usr bin bundle 23 in
  • Rails Partial (Rails 3, HAML) 任意慢

    我使用的是 Rails 3 0 1 HAML 0 3 22 和 Mongrel 1 1 5 MongoMapper 不是 AR 我正在渲染一个列表 每个列表项都是它自己的部分 每次页面渲染其中一个列表项部分时 渲染时间都会延长近 100 倍
  • 如何检查水豚中的复选框?

    我正在使用 Rspec 和水豚 我怎样才能写一个步骤来检查checkbox 我试过了check按价值但它找不到我的checkbox 我不知道该怎么做 因为我实际上有相同的 ID 但值不同 这是代码
  • 将对象数组中的属性映射到另一个数组的更有效的 Ruby 方法?

    我不会在这里重复我的问题 但是有没有更有效的方法来写这个 def recruits names names for r in self referrals do names lt lt r display name end return n
  • 使用 Ruby 获取 AWS 区域名称

    我正在为 AWS 开发 Rails 应用程序 并希望为区域名称创建下拉菜单 例如 us east 1 等 如果有人已经创建了 gem 来获取它们 我想使用它 有人知道这样的 gem 或有用的 API 吗 适用于 Ruby 的 AWS 开发工
  • Ruby on Rails 最酷的功能是什么,为什么选择它? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我问这个问题之前 我浏览了 SO 上 Ruby on Rails 的搜索结果 找不到太多 但以下 在此页面上找到 https stackove
  • ruby on Rails,会话过期通知

    我正在使用 ruby 1 9 3 和 Rails 3 2 我的实际会话处理如下所示 会话助手 def sign in user cookies remember token value user remember token expires
  • Rails:渲染不起作用,仍然出现“模板丢失”

    我目前正在学习 Rails 指南 我完成了这些步骤 但仍然遇到错误 我的 Ruby 版本是ruby 2 1 1p76Rails 版本是4 0 4 按照指南的指示 我创建了一个Article Controller class Articles
  • 如何使用 Ruby 2.7.0 修复 Rails 的警告消息

    有没有人解决这个问题Ruby 2 7 0 I used rbenv并安装了 Ruby v2 7 0 然后使用创建了一个 Rails 项目Rails v6 0 2 1 目前 通过运行之一 rails s rails s u puma rail
  • 使用 YAML.load 解析 json 安全吗?

    我使用的是红宝石2 1 0 我有一个 json 文件 例如 测试 json item apple 1 banana 2 使用 YAML load 加载此文件是否安全 YAML load File read test json 我正在尝试加载
  • Rails 3 - “无法解析 Yaml”

    我不知道我做错了什么 我尝试运行 rails c 但它只是给了我一个错误 10 分钟前它还在工作 C Ruby192 lib ruby 1 9 1 psych rb 148 in parse couldn t parse YAML at l
  • 什么是 - 获取的是一个目录 - 错误消息

    我收到这个奇怪的错误 Users gideon Documents ca ruby rubytactoe lib player rb 13 in gets Is a directory spec Errno EISDIR 玩家规格 rb r

随机推荐