局部变量以下划线开头是个好习惯吗?

2023-12-30

我刚刚接触 Ruby,并且来自 Java 和 C/C++ 环境。

在用 Ruby 编写第一个小项目时,我不知何故习惯了让所有局部变量都以下划线开头。我想我这样做的主要动机是更好的可读性以及与方法调用的区别。

原则上只有三种类型的变量($global, @instance and local),绝大多数变量以下划线开头。我不太确定这是好是坏。此外,在许多其他语言中,下划线会被替换为其他字符。

有没有某种最佳实践关于通常的变量命名骆驼香烟盒 and/or 下划线分隔?专业“红宝石专家”有哪些习惯?当我选择前导下划线时,我是否忽略了一些通用的 Ruby 约定?


edit
感谢所有的答案和建议。这对我帮助很大。


下面是答案和评论的简短摘要
(针对时间短的访客)

前导下划线与:

  • 方法参数:def my_method(_my_arg)
  • 块参数:例如my_array.each { |_x| puts _x}

所有其他局部变量都没有前导下划线,因为程序员来自例如JavaScript 可能会感到困惑 https://stackoverflow.com/a/8977083/588243关于变量的预期行为。

为了变量名和方法调用之间的视觉分离,强迫自己使用“(“括号”)" with all方法调用可能会显着提高可读性。


这个问题的现有答案已经有几年了,而且惯例也发生了变化。您应该只使用前导下划线 (_some_param),或独立的下划线 (_),表明您不关心该值。这rubocop https://github.com/bbatsov/rubocop如果您分配一个变量但不使用它,样式 linting 工具会抱怨“无用的分配”,但它会忽略带有前导下划线的变量。这可以让您明确表示您不关心该值并且不打算使用它。

下面是 RSpec 上下文中的一个有点人为的示例用例:

describe 'login' do
  let(:user) { FactoryGirl.create(:user, login: 'bob') }
  it 'must be unique' do
    _user1 = user
    user2 = User.new login: 'bob'
    expect(user2.valid?).to be_false
  end
end

在这里我们表明我们的userhelper 有副作用并返回一些东西,但我们不关心它。您也可以完全跳过该作业,但看到一个裸露的useron a line 本身看起来很奇怪,并且没有清楚地揭示其意图:

describe 'login' do
  let(:user) { FactoryGirl.create(:user, login: 'bob') }
  it 'must be unique' do
    user
    user2 = User.new login: 'bob'
    expect(user2.valid?).to be_false
  end
end

其他场景包括忽略迭代器中的值,或者重写您想要保留原始方法签名但不关心某些值的方法:

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

局部变量以下划线开头是个好习惯吗? 的相关文章

  • 如何从 ruby​​ 中的字符串名称创建类实例?

    我有一个类的名称 我想创建该类的一个实例 以便我可以循环该类的架构中存在的每个 Rails 属性 我该怎么做呢 我的名称是我想要检查的类的字符串 我想我需要实例化一个类实例 以便我可以 循环遍历它的属性并打印它们 在 Rails 中你可以这
  • 如何从 Ruby 程序发送邮件?

    我想从 Ruby 应用程序发送电子邮件 核心语言中是否有调用来执行此操作 或者是否有我应该使用的库 最好的方法是什么 如果你不想使用行动邮递员 http wiki rubyonrails org rails pages ActionMail
  • Heroku 部署错误

    在 Windows 环境中 尝试部署到 Heroku 时出现以下错误 C Ruby lib ruby gems 1 8 gems heroku 1 9 13 lib heroku commands base rb 32 in 没有这样的文件
  • ruby 中的 #encode 和 #force_encoding 有什么区别?

    我真的不明白之间的区别 encode and force encoding在 Ruby 中String班级 我明白那个 kam force encoding UTF 8 将迫使 kam 是UTF 8编码 但是怎么样 encode encod
  • 使用 attr_accessor 动态创建类属性

    在Ruby中 有没有办法动态地将实例变量添加到类中 例如 class MyClass def initialize create attribute name end def create attribute name attr acces
  • Rails:named_scope、lambda 和块

    我认为以下两个是等效的 named scope admin lambda company id conditions gt company id company id named scope admin lambda do company
  • Bundle 说 gem 丢失了 - 但事实并非如此?

    背景 我正在维护contentRuby On Rails 站点 但我确实没有 Rails 的经验 当尝试运行 Rails 服务器时 rails s我明白了 在任何来源中均找不到 activesupport 3 2 0 Run bundle
  • Ruby/Rails 集合到集合

    我有两个表与一个连接表连接 这只是伪代码 Library Book LibraryBooks 我需要做的是 如果我有一个图书馆的 id 我想获取该图书馆拥有的所有书籍所在的所有图书馆 因此 如果我有图书馆 1 图书馆 1 中有书籍 A 和
  • 如何从 Ruby 中的特定相对路径加载文件?

    我正在制作一颗供内部使用的宝石 在其中 我从另一个目录加载一些 YAML in
  • Ruby 是否有一个 Expect 等效 gem?

    Ruby 是否有一个 Expect 等效 gem 我尝试在 code google 和 ruby gems org 上搜索 但遗憾的是它没有出现 FYI Expect http en wikipedia org wiki Expect是一个
  • 为 RoR 中的每个用户创建新的 URL 路径

    如何在 Ruby on Rails 中实时创建新的 URL 路径 例如 我希望我的用户拥有 name XXX com 或 XXX com name 仅供参考 我在 Heroku 上托管代码 看看 subdomain fu 插件 https
  • 在 Sinatra 中运行后台进程

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

    我正在尝试将 GIF 图像调整为不同的尺寸 我在 ruby 中使用 RMagick 库 但对于某些 gif 图像 即使我缩小 GIF 的大小 文件大小似乎也会增加 我正在以相同的纵横比调整图像图像的大小 这是我的代码 require rma
  • Watir Webdriver 加载 Chrome 扩展

    我正在尝试使用 Watir 加载 chrome 扩展 但遇到了问题 我发现这个相关问题 能够启动带有 watir webdriver 加载扩展的 chrome https stackoverflow com questions 125867
  • 带有 git Remote 的 Gem 文件在 Heroku 推送上失败

    我的 gemfile 中有以下行 gem client side validations git gt email protected cdn cgi l email protection Dakuan client side valida
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in
  • 如何在不初始化Rails的情况下从schema.rb创建数据库?

    我正在尝试从 schema rb 创建所有表 我使用命令 rake db schema load 但是 这失败了 因为在我的一个初始化程序中 它引用了一个显然不存在的模型 表 因为数据库为空 我可以注释掉这些行 然后再次运行 schema
  • Ruby:如何在不创建新实例的情况下检查实例方法的参数?

    在 Ruby 1 9 2 中 您可以使用 method symbol 检查任何方法的参数 如何在不创建新车的情况下检查 Car initialize 方法 class Car def initialize fuel type passeng
  • ruby rspec 不能与 simplecov 一起使用

    我安装了 simplecov gem 并添加了 require simplecov SimpleCov start 到spec helper rb文件 现在如果我在some file spec rb文件中包含spec helper rb并尝
  • 如何在 Ruby 中将 DateTime.now 转换为 UTC?

    如果我有d DateTime now 如何将 d 转换为 UTC 带有适当的日期 DateTime now new offset 0 将在标准 Ruby 中工作 即没有 ActiveSupport

随机推荐

  • Java:静态最终字段按什么顺序初始化?

    好吧 假设我有一堂课 如下所示 public class SignupServlet extends HttpServlet private static final Logger SERVLET LOGGER COMPANYLog ope
  • Vue.js 组件 prop 没有 2 路绑定?

    I found 这个问题是类似的 https stackoverflow com questions 44790842 vuejs right way to edit prop without changing parent data 但它
  • 为什么静态类在 Java 中是非法的?

    我正在开发一个 Android 应用程序 但遇到了一些困难 我不断收到错误 Illegal modifier for the class FavsPopupFragment only public abstract final are pe
  • 获取生成器的子集

    我有一个生成器函数 想从中获取前十项 我的第一次尝试是 my generator 10 正如错误告诉我的那样 这不起作用 因为生成器不可订阅 现在我已经解决了这个问题 list my generator 10 这是有效的 因为它将生成器转换
  • AWS ALB + Django + Gunicorn +- Nginx?

    我正在 AWS 中构建一个环境来托管 django 应用程序 我试图弄清楚是否应该使用 nginx 作为构建的一部分 我在下面列出了一些不同的环境 以供示例 比较之用 所有环境都使用 AWS ALB ENV 1 ALB gt dockerc
  • nptl SIGCONT 和线程调度

    我正在尝试移植依赖于 SIGCONT 的代码来停止应用程序的某些线程 对于当前的 linux nptl 实现 似乎不能依赖 2 6 x 内核中的实现 我正在尝试设计一种方法来停止其他线程 目前我只能考虑互斥体和条件变量 任何提示表示赞赏 如
  • PHP 中JavaScript 的decodeURIComponent 的等价物是什么?

    我有一个包含 unicode 字符的字符串 我正在通过 HTTP 传输该字符串 该字符串是用 Javascript 编码的encodeURIcomponent php 中是否有与 Javascript 等效的函数decodeURICompo
  • Google Play 说我使用 Android Studio Build->Generate Signed APK 构建的 APK 是可调试的

    我收到消息 您上传了可调试的 APK 出于安全原因 您需要先禁用调试 然后才能在 Google Play 中发布 了解有关可调试 APK 的更多信息 我使用 Android Studio 生成 APK 构建 gt 生成签名 APK 我创建了
  • Tmux:失去焦点时自动隐藏面板

    我最近开始使用 tmux 进行 Vim 编辑 在 PyCharm 中 我曾经在底部有一个终端 我可以通过几次按键来切换屏幕 我希望 tmux 具有相同的功能 在 Vim 中全屏编辑代码 然后当我需要运行命令时 直接转到屏幕底部的终端窗格 然
  • 我的服务器可以同时运行多少个 php 脚本?

    我有一个最终用户可以访问的脚本 该脚本可以进行以下调用 exec php orderWatcher php insertedId gt dev null 在 orderWatcher php 中我做了一些需要很长时间的操作 if check
  • 如何通过命令行向sql脚本传递参数

    有一个要求 我试图自动化项目中的一个流程 其中需要运行 sql 来进行日常报告 sql 如下所示 这是最简单的形式 但我的 sql 有 400 行 下面只是获取结果的示例 test sql select from table where c
  • .query 字符串中的美元符号 ('$') 是什么意思?

    什么是 该声明中的符号含义 SQL Query gt Update Data client query UPDATE items SET text 1 complete 2 WHERE id 3 data text data complet
  • 按索引选择多索引数据框中的行而不丢失任何级别

    我想选择一个名为 Mid 的行 而不丢失它的索引 Site 以下代码显示了数据框 m commodity price max maxperstep Site Commodity Type Mid Biomass Stock 6 0 inf
  • spring数据休息更新产生交叉连接sql错误

    我想使用 Spring Data Rest 来更新某些用户的行 但在运行时此查询在查询中添加了奇怪的 交叉联接 Spring数据休息方法 Modifying Transactional Query Update Notification n
  • 如何使用python的telnetlib从设备获取固定时间段的数据?

    我正在通过 telnet 连接到硬件设备 该设备的 I O 非常简单 因此 我向它提交一个命令 然后设备每秒一次一次输出一行数据 每行仅包含一个数字 所以我的问题是这样的 如果我使用python的telnetlib连接到这个设备 我如何获取
  • 防止双重投票

    我正在创建一个 Web 应用程序 用户将通过单击 赞成 或 反对 来为某些候选人投票 并且这些用户在该网站上没有任何帐户 最好使用什么技术 是否有必要使用验证码来进一步防范垃圾邮件 预计投票数将达到数百万 主题也不是很关键 只要我得到 95
  • 基本的 javascript 流程 - 在各种浏览器中

    我试图通过一个非常简单的 JavaScript 示例来学习 JavaScript 中的流程 但是三种浏览器 Chrome IE 和 Firefox 这三种浏览器都显示不同的流程模式和不同的最终结果 我知道会出现跨浏览器问题 但这个问题非常简
  • 将 bsxfun 与匿名函数一起使用

    在尝试理解 bsxfun 函数之后 我尝试在脚本中实现它以避免循环 我试图检查数组中的每个单独元素是否包含在一个矩阵中 返回一个与分别包含 1 和 0 的初始数组大小相同的矩阵 我创建的匿名函数是 myfunction x y sum an
  • 在 jQuery 对话框中时,asp.net 表单控件不可读,如何修复它?

    我有一个带刺的 我有一个 ASP NET Web 表单页面 在页面中 我有一个 div 标签 我已将其设置为用作 jQuery 对话框 div 中是一些 jQuery 控件 我打开对话框并单击其中一个按钮开始回发 当页面回发时 隐藏代码尚未
  • 局部变量以下划线开头是个好习惯吗?

    我刚刚接触 Ruby 并且来自 Java 和 C C 环境 在用 Ruby 编写第一个小项目时 我不知何故习惯了让所有局部变量都以下划线开头 我想我这样做的主要动机是更好的可读性以及与方法调用的区别 原则上只有三种类型的变量 global