首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >A=a\b与||= _b之间的差异

A=a\b与||= _b之间的差异
EN

Stack Overflow用户
提问于 2016-01-12 05:19:27
回答 2查看 972关注 0票数 4

我正在阅读编程Ruby,实用程序员指南( Pick ),作者声称:

代码语言:javascript
复制
var = var || "Default Value"

以及:

代码语言:javascript
复制
var || = "Default Value"

我不明白这一点,因为这和我所能看到的没有什么不同。有人能帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-12 05:26:44

引用资源这里

在a=a\b中,a是通过每次运行时的语句设置为某个值的,而如果使用了一个{##**$$}}a= b,则只有当a在逻辑上是假的(即如果它是空的或假的)时,才会设置a,因为它是‘短路’。也就是说,如果比较的左手边是真的,就没有必要检查右手边。

这基本上意味着它们的行为与开发工具类似,但在内部,实现与上面解释的不同。

编辑:正如注释中指出的,上面的解释认为a || a = b而不是a ||= b。一个非常好的观点和阅读同样的链接进一步澄清了这一点:

如果未定义a,则用x= 42引发NameError,而||= 42则返回42。所以,它们似乎不是等价的表达方式。

因此,同样,它们不是相同的语句,因为Ruby在解析时看到赋值时就分配了一个变量(这是a ||= 42的情况)。

最后一句,你不会认为这是我编造的,:)

Ruby在解析阶段看到了赋值,并且创建变量的方式并不是用x= 42,尽管一旦实际执行发生,它的行为就会像后者一样。

票数 3
EN

Stack Overflow用户

发布于 2016-01-12 06:09:52

如果使用带有getter和setter的类,这种区别就会变得更加明显:

代码语言:javascript
复制
class Foo
  def var
    puts 'Foo#var called'
    @var
  end
  def var=(value)
    puts 'Foo#var= called'
    @var = value
  end
end

您的第一个示例导致调用Foo#var=的时间非常长:

代码语言:javascript
复制
f = Foo.new
f.var = f.var || "Default Value"
# Foo#var called
# Foo#var= called
f.var = f.var || "Default Value"
# Foo#var called
# Foo#var= called

而在第二个示例中,Foo#var=只被调用一次:

代码语言:javascript
复制
f = Foo.new
f.var ||= "Default Value"
# Foo#var called
# Foo#var= called
f.var ||= "Default Value"
# Foo#var called
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34736116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档