加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby,define [] = operator,为什么不能控制返回值?

发布时间:2020-12-16 23:04:19 所属栏目:百科 来源:网络整理
导读:尝试做一些奇怪的事情可能会变成更有用的东西,我试图在自定义类上定义我自己的[] =运算符,你可以做它,并返回与value参数不同的东西,显然你不能做. [] =运算符的返回值始终为值;即使您重写此运算符,也不会控制返回值. class Weird def []=(key,value) puts "#
尝试做一些奇怪的事情可能会变成更有用的东西,我试图在自定义类上定义我自己的[] =运算符,你可以做它,并返回与value参数不同的东西,显然你不能做. [] =运算符的返回值始终为值;即使您重写此运算符,也不会控制返回值.
class Weird 
  def []=(key,value)
    puts "#{key}:#{value}"
    return 42
  end
end

x = Weird.new
x[:a] = "a"
  output "a:a"
  return value => "a"  # why not 42?

有人有解释吗?有什么办法吗

rubyMRI 1.8.7.所有的ruby都是一样的是语言的一部分吗?

解决方法

请注意,此行为也适用于所有赋值表达式(即属性赋值方法:def a =(value); 42; end).

我的猜测是,它是这样设计的,使得很容易准确地理解作为其他表达式的一部分使用的赋值表达式.

例如,期望x = y.a = z [4] = 2是合理的:

>调用z.[] =(4,2),然后
>调用y.a =(2),然后
>将2分配给局部变量x,最后
>对任何“周围”(或较低优先级)表达式产生值2.

这跟随principle of least surprise;如果相反,它最终等于x = y.a =(z.[] =(4,2))(最终值受两个方法调用影响),这将是相当令人惊讶的.

虽然不是完全权威的,但这里是Ruby编程所说的:

> Programming Ruby(1.8),在Expressions部分:

An assignment statement sets the variable or attribute on its left side (the lvalue) to refer to the value on the right (the rvalue). It then returns that value as the result of the assignment expression.

> Programming Ruby 1.9 (3rd ed)第22.6节表达式,条件和循环:

(之后描述[] =方法调用)

The value of an assignment expression is its rvalue. This is true even if the assignment is to an attribute method that returns something different.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读