【问题标题】:Using defined? in a Ternary operator使用定义?在三元运算符中
【发布时间】:2015-07-02 13:17:15
【问题描述】:

我正在尝试从中清理我的代码...

<% if defined? foo == "local-variable" %>
    <% foo = foo %>
<% else %>
    <% foo = nil %>
<% end %>

要像这样使用三元运算符...

<% defined? foo == "local-variable" ? foo : nil %>

但是三元不能正常运行并且默认为nil ...我对使用三元运算符相当陌生(可能已经养成使用它们的习惯,因为它们可以节省行数)...正在使用@ 987654324@在三元中可能吗?

【问题讨论】:

  • 顺便说一句,您的第二个语句不等于第一个 - 缺少赋值,即 foo 未设置为 nil
  • 真的需要foo = foo吗?
  • @limekin 不,我更倾向于建议&lt;% foo=nil unless local_variable_defined?(foo) %&gt; 或@PiotrKruczek 建议&lt;% foo ||= nil %&gt;,但无论哪种方式,这些都与问题无关。我也不知道这里的实现,也不知道为什么这个逻辑必须存在于视图而不是控制器或模型中。
  • 另外考虑到 == 是一种方法,并且 Ruby 中的方法调用是从右到左评估的,我认为在您的初始代码中foo == 'local-variable' 首先评估给false,然后是defined? false被评估,这使得 if 条件总是返回 true。

标签: ruby


【解决方案1】:

应该是:

<% defined?(foo) == "local-variable" ? foo : nil %>

From documentation:

...返回值提供有关表达式的信息。

>> defined?(foo) == "local-variable"
=> true
>> defined? foo
=> "local-variable"
>> defined? (foo == "local-variable")
=> "method"

Ruby operator precedence

【讨论】:

  • 啊,完美,我只是忘记了括号。谢谢!
  • 你可以用local_variable_defined?(:foo)代替defined?(foo) == "local-variable"
  • defined? 应避免使用,除非您确切知道自己在做什么。由于您只是将它用于局部变量,因此我同意@Stefan 的建议。有关defined? 的一些问题,请参阅我的回答(stackoverflow.com/questions/29371966/…
【解决方案2】:

这并不完全是您问题的答案,但这样的事情可能会有所帮助:

foo ||= nil

翻译为:

if defined? foo
  foo || foo = nil
else
  foo = nil
end

【讨论】:

  • 这不是准确地正确的。这转换为if (foo),这意味着foo 可以是falsenil。有人说要添加//=,这正是您在此处谈论的内容,但我不确定该提案的去向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 2011-09-10
  • 2020-11-23
  • 2018-12-14
相关资源
最近更新 更多