用于访问数组中第一个/最后一个元素的 Ruby 约定[关闭]

2024-01-08

这是一个关于约定的问题。下面的两组命令返回相同的结果。

a = [1, 2, 3]

a.first  # => 1
a[0]     # => 1

a.last   # => 3
a[-1]    # => 3

在 Ruby 中,显式索引和函数中哪一个更受青睐?当然,假设这是在代码中always访问第一个或最后一个元素。

注意:我一直在考虑每个周期需要的周期。因为first and last接受参数,它们会有更多的开销,但我不知道这是否会影响社区的偏好。

Thanks!


EDIT

如果您阅读了这篇文章的评论,就会发现关于我的最后一段的争论很大。虽然我不记得了[x]相当于.[](x),我的结论是正确的,第一个和最后一个有更多的开销。考虑到两者的性质,我认为这是由于参数检查first/last。这些需要检查是否有参数,而[]可以假设它们存在。

CODE

require 'benchmark'

a = [1..1000]

MAX = 1000000

Benchmark.bm(15) do |b|
  b.report("small first") { MAX.times do; a.first; end }
  b.report("small [0]")   { MAX.times do; a[0];    end }
  b.report("small last")  { MAX.times do; a.last;  end }
  b.report("small [-1]")  { MAX.times do; a[-1];   end }
end

a = [1..100000000000]

Benchmark.bm(15) do |b|
  b.report("large first") { MAX.times do; a.first; end }
  b.report("large [0]")   { MAX.times do; a[0];    end }
  b.report("large last")  { MAX.times do; a.last;  end }
  b.report("large [-1]")  { MAX.times do; a[-1];   end }
end

RESULTS

                      user     system      total        real
small first       0.350000   0.000000   0.350000 (  0.901497)
small [0]         0.330000   0.010000   0.340000 (  0.857786)
small last        0.370000   0.000000   0.370000 (  1.054216)
small [-1]        0.370000   0.000000   0.370000 (  1.137655)
                      user     system      total        real
large first       0.340000   0.010000   0.350000 (  0.897581)
large [0]         0.320000   0.010000   0.330000 (  0.889725)
large last        0.350000   0.000000   0.350000 (  1.071135)
large [-1]        0.380000   0.000000   0.380000 (  1.119587)

代码被读取的次数多于被写入的次数, and first and last不需要花太多精力就能理解,特别是对于经验不足的 Ruby 程序员或来自具有不同索引语义的语言的人来说。

虽然大多数程序员会立即知道它们是相同的:

a.first
a[0]

第一个仍然更容易阅读。阅读难度没有明显差异,但确实存在。

last是另一个问题。访问索引 0 将获得几乎任何语言的数组的第一个元素。但负索引仅在某些语言中可用。如果一个具有最少 Ruby 经验的 C 程序员尝试阅读我的代码,他们会更快地理解哪个代码?:

a.last
a[-1]

负索引可能会迫使他们进行谷歌搜索。

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

用于访问数组中第一个/最后一个元素的 Ruby 约定[关闭] 的相关文章

  • Rails 模型中 self 的价值是什么?为什么没有明显的实例方法可用?

    我的 Rails 3 1 6 应用程序中有一个自定义访问器方法 即使该值不存在 它也会为属性分配一个值 my attr 属性是一个序列化哈希 除非指定了空白值 否则应将其与给定值合并 在这种情况下 它将把当前值设置为空白值 添加了检查以确保
  • Rails 2 Mailer View 将 3D 添加到字符串之前

    我有一个非常旧的 Rails 应用程序 它试图为新用户发送验证电子邮件 但永远找不到令牌 因为由于某种原因 无论我如何生成链接 链接都会以 3D 形式添加到字符串前面 由于某种原因 它似乎还在标记的中间注入了一个 符号 这是一些带有输出的代
  • RoR2.8&Heroku:我安装了一个插件,可以在本地工作,现在heroku根本无法工作

    Heroku 日志显示 gt dyno 3334279 log crash lt app fd916ea6 bad5 440e a560 405ef5e3beee home bundle gems ruby 1 8 gems searchl
  • 列出 Rails 控制器实例变量

    我试图列出控制器内的实例变量 但想出了 irb gt HomeController instance variable names gt visible actions inheritable attributes controller p
  • Ruby on Rails 中 RESTful POST 的功能测试

    我想为我正在 Ruby on Rails 应用程序中开发的 RESTful Web 服务编写功能测试 该测试是 POST 请求 其中请求正文是纯 XML 文档而不是表单 有关如何执行此操作的任何指示 我遇到的问题是如何在调用 post 方法
  • 我应该使用哪些插件/gems 在 Rails 3 中动态动态生成缩略图?

    所以 事情是这样的 我正在构建我的第一个 Rails 应用程序 它从目录及其子目录中读取图像 现在 我想生成这些图像的动态缩略图 但我不想用缩略图填充该目录 我正在考虑在临时目录中为每个用户单独缓存这些拇指 哦 而且 我还需要图像的尺寸来实
  • Ruby && 和 = 运算符的误解

    您认为 Ruby 中的下一个表达式的结果会是什么 a 10 b 25 尝试在 ming 中计算然后使用irb 所以 如果我们看一下 Ruby 文档运算符优先级 https ruby doc org core 2 2 0 doc syntax
  • 是否可以反转类中包含的模块?

    您可以将模块包含在类中 以通过向特定类添加类方法和实例方法来扩展类功能 module M def self class method from module from class method from module end def ins
  • Ruby“定义”?操作员工作错误?

    所以 我们有代码 class Foo def bar puts Before existent defined some variable puts Before not existent defined nonexistent varia
  • RVM 和 OpenSSL 的问题

    尝试为同事设置一台新 MacBook 进展不顺利 首先我安装 OpenSSL Heathers MacBook Pro heather rvm pkg install openssl Fetching openssl 1 0 1c tar
  • RubyMine 无法识别 Rails 应用程序

    我有一个关于使用从目录打开方法将 Rails 应用程序导入 RubyMine 的问题 我的计算机上有两个不同的 Rails 应用程序 但 RubyMine 只将其中一个识别为 Rails 应用程序 而将另一个识别为普通目录 这是一个问题 因
  • Readline、输入记录分隔符和 Ruby

    在 Ruby 中 我希望读取数据 直到到达分隔符或文件末尾 我发现通过重新定义这是可能的 or the INPUT RECORD SEPARATOR到我的分隔符 然而 考虑到 Ruby 语言中的所有 功能 更改全局值来执行此操作似乎很笨拙
  • 使用 RSpec 测试 rake 任务后清除数据库

    我正在尝试使用 rspec 测试我的 rake 任务 它运行良好 但问题是记录随后不会被删除 我已经把config use transactional fixtures true在配置文件中没有影响 在其他测试中它运行良好 这是我的代码 r
  • Ruby 中“singleton”方法驻留在哪里?

    我正在玩singleton class在我的IRB中 并尝试了以下片段 class Foo end gt nil foo Foo new gt
  • 使用 Ruby CSV 在第 1 行中进行非法引用

    我收到此错误 Illegal quoting in line 1 CSV MalformedCSVError 我的文件中的第 1 行如下 Status Internal ID Language Created At Updated At I
  • Ruby 中 return 的意义是什么?

    有什么区别return只需放置一个变量 如下所示 没有回报 def write code number of errors if number of errors gt 1 mood Ask me later else mood No Pr
  • Rails 3.2.3 命名空间控制器被同名的全局控制器覆盖

    当全局应用程序控制器首先加载时 命名空间应用程序控制器在加载该命名空间内的页面时不会加载 应用程序控制器如下所示 class ApplicationController lt ActionController Base protect fr
  • Sinatra 启用:会话不适用于乘客/apache

    我在启用 sessions 时遇到问题 以维持在 guest apache 上托管的简单 Sinatra 应用程序 我将会话 authorized 的状态存储在cookie 中 当托管在 Rack Handler Mongrel 上时 它可
  • 如何在 rake 任务中强制使用 RAILS_ENV?

    我有这个小耙子任务 namespace db do namespace test do task reset do ENV RAILS ENV test Rake Task db drop invoke Rake Task db creat
  • MacOS 每秒唤醒次数错误

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

随机推荐

  • 如何为内存中的 HSQL 编写自定义函数

    我想在 HSQL 中编写一个简单的函数 以便它向后兼容 DB2 函数 理论上 我应该能够用 java 编写自定义函数并将其挂接到 HSQL 中 有这方面的任何指导 文件吗 用户定义的函数记录在 HSQLDB 指南中 有关用 Java 编写的
  • java中防止线程重复处理

    问题陈述 我有一个JMS侦听器作为侦听主题的线程运行 一旦有消息进来 我就会生成一个新的Thread处理入界消息 因此 对于每条传入的消息 我都会生成一个新的Thread 我有一个场景 当按顺序立即注入重复消息时 也会处理重复消息 我需要阻
  • 跨多个应用程序的 Google Smart Lock

    我一直在尝试让谷歌的智能锁在我拥有的两个应用程序之间工作 不幸的是使用不同的密钥库 但没有任何运气 在 Smart Lock 中保存一个应用程序的密码非常简单 APP 1 做类似的事情 Credential credential new C
  • 使 svg 容器在数组循环中出现在另一个容器下面

    我有以下代码 我创建了两个不同高度和宽度的 svg 容器 并为数组中的每个元素创建它 该代码运行良好 但我想要 svg 容器 text1 其中包含title1出现在 svg 容器 text2 下方 显示title2而不是像现在这样并排 即彼
  • 如何为 Java EE 开发人员升级 Eclipse?

    有没有什么不痛苦的方法来升级 Eclipse 安装 我尝试浏览 eclipse 站点 但找不到有用的描述 将更新 URL 添加到您的可用站点 窗口 gt 首选项 gt 安装 更新 gt 可用软件站点 gt 添加 Name Oxygen Lo
  • Blazor WASM - 全局捕获 401 并导航到所有 HttpClient 调用的登录页面

    In blazor template httpclient添加在Program cs class builder Services AddTransient sp gt new HttpClient BaseAddress new Uri
  • 是否可以在 Android/dalvik 中重写 Java 类中的本机方法?

    我正在对一个类进行单元测试TestMe使用 EasyMock 及其方法之一 例如method N n 需要一个类型的参数N它有一个本机方法 比如nativeMethod class TestMe void method N n Do stu
  • 移动/触摸屏幕 - 滑动时水平滚动

    这个问题是在详细讨论后提出的这个问题 https stackoverflow com q 11649405 226906 Problem 我需要一个水平滚动 可以使用桌面上的鼠标拖动和启用触摸的屏幕上的滑动事件来滚动 可能的解决方案 我尝试
  • 时间:2019-03-07 标签:c#PinvokeforGetWindowDpiAwarenessContext

    我试图在 C 应用程序中实现 GetWindowDpiAwarenessContext 但没有成功 相关头文件是 windef h DECLARE HANDLE DPI AWARENESS CONTEXT typedef enum DPI
  • 替换全球变音符号[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 将变音符号替换为 UTF 8 字符串中最接近的 7 位 ASCII 等效项 https stackoverflow com questions 158241 php replace umlau
  • Kivy 多显示器

    我正在考虑使用 Kivy 创建一个需要在每个监视器上显示一个窗口的程序 有没有办法实现这一点 我也不希望有一个跨越的窗口 如果没有 是否有另一个 好看的 windows linux GUI 工具包可以完成这个任务 您可以有两个单独的窗口运行
  • 添加常见图例

    我试图做一个多图ggplot2 这是我最初的代码 nucmer s1 lt ggarrange eight uniform ten uniform twelve uniform fourteen uniform sixteen unifor
  • 一次撤销多个用户的 Oracle 权限

    我们正在合理化我们的数据库用户权限 为此 我们希望撤销授予所有用户 但不是特定角色 的架构中所有表的所有选择权限 通过一些正则表达式 我尝试创建一个通用的revoke对于每个表 给出如下内容 撤销 USER1 USER2 USER3 对 T
  • SQL*Plus 脚本执行两次

    我正在尝试使用 sqlplus 运行脚本 我的脚本是一个简单的删除语句 我通过将以下内容放入 ksh 终端来执行它 sqlplus username password sql delete societes sql sql delete s
  • AttributeError:“模块”对象没有属性“请求”

    当我在 Python 3 3 中运行以下代码时 import urllib tempfile urllib request urlopen http yahoo com 我收到以下错误 我也这样做来验证 我究竟做错了什么 The urlli
  • 如何在 Unity 协程中通过引用局部变量?

    我有一些函数可以接受 Enemy 实例并更改其字段之一 敌人类别有一些基本字段 如速度 伤害 攻击范围 每个函数只存储敌人的一个正常值 然后将当前字段更改为某个值一段时间 然后将其更改回正常状态 我在 Unity 中编写代码并使用 Coro
  • 无法在anaconda上安装tensorflow

    我正在尝试在 anaconda 上安装tensorflow i tried conda install c conda forge tensorflow 但安装卡住了Solving environment 寻找解决方案 因此有人建议使用调试
  • 使用回车键提交输入字段

    我正在构建天气应用程序 并希望使用 Enter 键将城市名称提交到服务器 我收到错误 提交不是一个函数 我想解决这个问题 并且想知道如何将值发送到 Express 服务器 以便在 API 调用中使用它 这是我的代码
  • 如何将 Beyond Compare 与 ClearCase 集成?

    我想将 Beyond Compare 与 ClearCase 集成 这样我就可以用它来比较和合并文件 而不是 ClearCase 提供的那些糟糕的工具 有人有执行此集成的说明吗 正如我的文章中提到的之前的回答 https stackover
  • 用于访问数组中第一个/最后一个元素的 Ruby 约定[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这是一个关于约定的问题 下面的两组命令返回相同的结果 a 1 2 3 a first gt 1 a 0 gt 1 a last gt 3 a 1