Ruby 三元运算符
为什么这两个陈述不等价?
- <代码>已定义?富?富 << "bar" : foo = ["bar"]
if (已定义? foo) then foo << "bar" else foo = ["bar"] end
第一条语句:
irb(main):001:0> defined? foo ? foo << "bar" : foo = ["bar"]
=> nil
irb(main):002:0> foo
=> nil
irb(main):003:0> defined? foo ? foo << "bar" : foo = ["bar"]
=> "expression"
irb(main):004:0> foo
=> ["bar"]
第二条语句:
irb(main):001:0> if (defined? foo) then foo << "bar" else foo = ["bar"] end
=> ["bar"]
irb(main):002:0> foo
=> ["bar"]
irb(main):003:0> if (defined? foo) then foo << "bar" else foo = ["bar"] end
=> ["bar", "bar"]
irb(main):004:0> foo
=> ["bar", "bar"]
这些会话使用 JRuby 1.5.0(应相当于本机 Ruby 1.8.7)。我发现本机 ruby 1.9.1 的行为略有不同:语句 #1 从未定义 foo
即使运行两次也是如此。
Why aren't these two statements equivalent?
defined? foo ? foo << "bar" : foo = ["bar"]
if (defined? foo) then foo << "bar" else foo = ["bar"] end
First statement:
irb(main):001:0> defined? foo ? foo << "bar" : foo = ["bar"]
=> nil
irb(main):002:0> foo
=> nil
irb(main):003:0> defined? foo ? foo << "bar" : foo = ["bar"]
=> "expression"
irb(main):004:0> foo
=> ["bar"]
Second statement:
irb(main):001:0> if (defined? foo) then foo << "bar" else foo = ["bar"] end
=> ["bar"]
irb(main):002:0> foo
=> ["bar"]
irb(main):003:0> if (defined? foo) then foo << "bar" else foo = ["bar"] end
=> ["bar", "bar"]
irb(main):004:0> foo
=> ["bar", "bar"]
These sessions are with JRuby 1.5.0 (should be equivalent to native Ruby 1.8.7). I see slightly different behavior with native ruby 1.9.1: statement #1 never defines foo
even when running it twice.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
因为第一个计算结果为:
为什么返回 nil,我不知道......
修复方法很简单:
Because the first evaluates to:
Why that returns nil, I have no clue...
The fix is simply to do:
无论哪种情况,您的代码都可能会被简化。根据上面的两个示例,看起来会有某种封闭循环。我不会尝试在其中创建
foo
并初始化为第一个['bar']
,而是这样做:或者,如果您不喜欢分手附加到数组的初始值设定项:
第二种方式有点“Perlish”,但它与 Ruby 方式相差不远,无法破译。
In either case, your code could probably be simplified. Based on the two samples above it looks like there'd be an enclosing loop of some sort. Rather than try to create
foo
inside it and initialize to the first['bar']
, I'd do something like:Or, if you don't like breaking up the initializer from where you append to the array:
This second way is a bit "Perlish", but it's not so far gone from the Ruby-way to be undecipherable.