在 ruby​​ 中,是否有一个 if 语句后跟另一个语句以“and”运算符(&&)结束该行的原因?

2023-12-24

我试图弄清楚为什么这会起作用以及这是否是一种不好的做法。

下面的代码会抛出一个语法错误:

if true &&
  puts "ok"
end

尽管以下代码不会执行,但它会按预期执行:

if true &&
  if true
    puts "ok"
  end
end

我在编写 ruby​​ 脚本时遇到了这个问题if语句包含一大串条件,因此我将每个条件放在单独的行中,然后注释掉最后一个条件并执行脚本。此刻,我意识到,if声明以&&操作员。虽然我预计它会抛出,但令我惊讶的是它没有抛出,因为另一个if随后发表声明。

我的红宝石版本是ruby 2.2.6p396 (2016-11-15 revision 56800) [x86_64-darwin16].


我试图弄清楚为什么这会起作用以及这是否是一种不好的做法。

后一个问题很难回答,因为您的代码非常抽象。此外,“不好的做法”是基于观点的,因此偏离主题。

下面的代码会抛出一个语法错误:

if true &&
 puts "ok"
end

这是一条红鲱鱼。请阅读错误消息:

SyntaxError: unexpected string literal, expecting `do' or '{' or '('
  puts "ok"
       ^

它没有说任何关于if.

我希望你的代码相当于

if true && puts "ok"
end

这确实引发了同样的问题SyntaxError:

SyntaxError: unexpected string literal, expecting `do' or '{' or '('
if true && puts "ok"
                ^

我们可以进一步缩小范围

true && puts "ok"

这是因为&&比以空格分隔的参数列表具有更高的优先级,因此该行被解析为

(true && puts) "ok"

因此,为了消除歧义,我们需要在参数列表中添加括号:

if true &&
  puts("ok")
end

现在代码按预期工作了。

尽管以下代码不会执行,但它会按预期执行:

if true &&
 if true
   puts "ok"
 end
end

事实上,这是完全合法的。行尾的二元运算符将隐式地继续该行,即此代码相当于:

if true && if true
    puts "ok"
  end
end

or

if true && if true then puts "ok" end
end

or

if true && if true then puts "ok" end then end

我在编写 ruby​​ 脚本时遇到了这个问题if陈述

这就是你困惑的根源:这是not an if陈述。这是一if 表达。 (从技术上讲,ISO Ruby 语言规范将其称为条件表达式。) 那里are noRuby 中的语句,只有表达式。

我很惊讶它没有因为另一个if随后发表声明。

It isn't一份声明。它与任何其他表达式一样。foo && bar是完全合法的并且foo && if true then 23 end也是完全合法的因为这是完全相同的事情: an &&两边都有一个表达式的运算符。

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

在 ruby​​ 中,是否有一个 if 语句后跟另一个语句以“and”运算符(&&)结束该行的原因? 的相关文章

  • Ruby 依赖注入库

    我一直在研究一些 Ruby 依赖注入库 特别是 我检查了Needle http needle rubyforge org and Copland http copland rubyforge org 它们已经存在很长一段时间了 但用途并不多
  • 验证 ActionCable 连接

    我发现了一个很棒的 ActionCable gem 它是 SPA 的一个很好的解决方案 我只想发送html css and js资产 所有其他连接将通过ActionCable 交换字符串或者整数并不难 但是如何通过ActionCable登录
  • 如何使用 Nokogiri 获取某些标签之后或之前的文本

    我有一个 HTML 文档 如下所示
  • rvm编译安装ruby 2.5.0出错

    我正在尝试使用 rvm 安装 ruby 2 5 0 但出现错误 我在 Ubuntu 18 16 和现在的 Linux Mint Cinnamon 上尝试过 基本上我在运行安装 ruby 的代码之前所做的是 打开 GPG 密钥https rv
  • If 语句中 Bool 计算错误

    只是为了好奇 我的代码有这个问题 e被评估为false 我知道通过查看数据库中的数据会得到错误 但 if 语句并不关心这一点 并假设这是真的 并试图抛出异常 有什么想法吗 edit 没有 在第 16 行末尾 价值false是正确的 我已经检
  • 如何使 Rails 3 资源预编译速度更快?

    我有一个正在运行的 Rails 3 2 1 应用程序 我正在通过 Capistrano 进行部署deploy assets它运行deploy assets precompile task 一切工作都很好 除了编译本身非常慢 我没有那么多 C
  • “没有可用的二元红宝石”是什么意思?

    每当我使用rvm install x x x 即使安装成功 我也会收到此警告 No binary rubies available for osx 10 12 x86 64 ruby 2 4 0 Continuing with compil
  • 从 Ruby 中的 DateTime 变量获取时间

    我在 ruby 中工作 我有一个包含数据库中今天的日期时间的对象 我只想要时间截断数据 我怎样才能得到那个 Try 日期时间 strftime http www ruby doc org stdlib 1 9 3 libdoc date r
  • 有没有人有 Ruby 和 Rake 的 Notepad++ 函数列表插件的解析规则

    我使用 Notepad 编辑 rake 文件 并且希望能够使用函数列表插件 我无法在线找到任何解析规则 并且 语言解析规则 对话框没有非常清晰的记录 我正在将方法解析到以下列表中 但还想显示任务 Function Begin t def t
  • 预期的 ProductField,出现数组问题

    我有一个 Rails 4 应用程序 它有一个如下所示的 params 块 def store params params require store permit name description user id products attr
  • Rails:CSRF 令牌不工作但已设置

    我在 Heroku 上有我的 Rails 3 应用程序 当我发送银行信息时 我得到 WARNING Can t verify CSRF token authenticity但我的 CSRF 令牌已设置 https gist github c
  • 通过推送通知唤醒

    Suppose 有一些对象 例如 一个数组a 和依赖于对象的条件 例如 a empty 当前线程以外的某些线程可以操作该对象 a 因此条件评估值的真实性会随着时间的推移而变化 如何让当前线程在代码中的某个时刻休眠 并在条件满足时通过推送通知
  • C# 要么返回 false 要么什么也不做

    我想知道是否有办法不必重复相同的事情如果施工而是调用一个状态检查 成功后无法返回true 有人知道这个问题更好的标题吗 bool Enable if GetStatus ref status Trace WriteLine Error re
  • MVC + Razor:如何有条件地添加起始

    我想根据变量是否设置来修改div 所以我想做这样的事情 if SomethingIsSet div style background red else div style background blue 但我在 Visual Studio
  • Ruby 枚举器中的“break”与“raise StopIteration”

    如果我使用 Ruby Enumerators 来实现生成器和过滤器 generator Enumerator new do y x 0 loop do y lt lt x x 1 break if x gt CUTOFF end end l
  • 如何从 ruby​​ 中的字符串名称创建类实例?

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

    我想从 Ruby 应用程序发送电子邮件 核心语言中是否有调用来执行此操作 或者是否有我应该使用的库 最好的方法是什么 如果你不想使用行动邮递员 http wiki rubyonrails org rails pages ActionMail
  • Rails 3 在 Ruby 1.9.2 上初始化非常慢

    我使用 RVM 来管理环境 安装了 Ruby 1 9 2 p136 我认为是最新版本 和 Rails 3 创建了 gemset 并运行捆绑器 到目前为止一切正常 但 Rails 在运行命令 即生成 销毁 rake 等 时初始化速度非常慢 完
  • Rails - 渲染:目标锚标记的操作?

    我希望像这样使用渲染 render action gt page form 我也尝试过这个 render template gt site page form 那也没用 这个特定页面上的表单位于最底部 如果提交时发生任何错误 我不希望用户被
  • rvm gem 安装错误?

    我正在摆弄 ruby gems 和 rvm 它工作得很好 但现在当我尝试安装 gem 时出现错误 gem install Rails错误 同时 执行 gem Errno EACCES 权限被拒绝 Users da rvm gems ruby

随机推荐