Ruby Ruby 赋值中的一个坑

jyootai · 2014年10月26日 · 最后由 chiangdi 回复于 2014年10月31日 · 5180 次阅读

之前一直没注意到这个问题。 在将 a , b 进行赋值值时: a = 3, b = 5 按照之前的理解,这时 a = 3, b = 5. 可是当带入后面的代码时居然一直报 a,b 类型出错,于是打开 irb 检查一番

> a = 3, b = 5
=> [3,5]
> a
=> [3,5]
> b
=> 5
> a.class
=> Array
> b.class
=> Fixnum

一看竟是如此!此时 a 是数组类型,b 是数值类型,原来 Ruby 中简单的赋值也是并非 C 中那样……

a, b = 3, 5

不是坑吧,a=3;b=5 就是正确的。c 里面 a = 3, b = 5 也最好也要用分号分隔吧。

写在一行看来是真有坑啊,呵呵

是你自己坑吧,就算是 C 里也应该是 a = 3 ; b = 5 啊,而且这明显要用到 ruby 里的并行赋值也就是 1 楼说的那样,明明是你自己概念不清,还好意思怪 ruby 赋值坑。。。ruby 是有一些看起来像黑魔法一样的容易坑人的地方。。。但你说的这个,真的不是,所以,赶紧把标题改了好好看看 ruby 基础

a = 3,b=5 不是应该是 a = [3,b=5] 么.......

在 c/c++ 里 a = 3, b = 5 是可以的,中间的逗号,就是逗号运算符,

在 ruby 中 a = 3, b = 5 ruby 并没有逗号运算符,这个表达式就相当于 a = 3, (b = 5), 也就是 a = 3, 5 ruby 的赋值操作有这样的特性,左边一个变量,右边多个值时,ruby 会创建一个包含右边值的数组,并赋值给左边的变量。

可以试试 a, = 3, b = 5 p a, b

当然不建议这么做。

#2 楼 @Peter 之前习惯了一行写,并且中间用逗号,没太注意这些细节。

#4 楼 @cifery 呵呵,之前对我来说这确实是一个坑,没发现错误怎么会知道在意这些细节,并行赋值是知道的,不过没发现刚才那么写是错误的,而且 C 中 a=3, b=5 这样真的是错的吗?我书读的少,别误导我阿,好好看看 C 基础吧

#5 楼 @liprais 恩,对的,开始习惯了 C 中的赋值,以为那样赋值再 Ruby 中是一样的效果

#6 楼 @xzgyb get

涨知识了,感谢分享。

#6 楼 @xzgyb a, = 3, b = 5 这个该如何理解?

@jyootai 嗯,C 只考过 2 级,这个确实不知道,长知识了,不过我的 C 基础跟我的 ruby 基础无关吧,我想说的是你自己想当然认为你被 ruby 坑了,就跑过来说 ruby 赋值有坑,这点不太好吧

这个确实是个坑。

#10 楼 @cifery 对于绝大部分静态语言来说,这就是个坑,不用晦言

#10 楼 @cifery 我去……这个说法有必要争论那么久么😓 ,标题的意思是再赋值这个地方有个小小的坑,同时也提醒其它以前没注意这点的人注意注意,以免也掉入这个坑,我并没有说 ruby 坑了我,看到你一直再说这个非重点的内容我也是醉了。。。

#12 楼 @ensonmj @jyootai,是这样啊,原谅我没有用过静态语言,我为我比较激进的言辞道歉

@chiangdi a, = 3, 5 如同 a, _ = 3, 5 告诉 ruby,赋值号左边有类似给多个变量赋值的行为,即不把 [3,5] 赋给 a, 只把 3 赋值给 a

这些在 <>书中有讲。

#15 楼 @xzgyb 非常感谢,刚才翻了下那本书看到了,还有 a, = [1, 2] 也会得到 a = 1, 真是各种用法。

这没啥坑的 =号优先级大 所以执行的结果是

b=5

a= 3, 5

就是这样的结果

#18 楼 @zj0713001 这样解释不对吧,你只看到后面的 = 号,怎么没看见前面的 = 号,如果说 = 号的优先级高,那么结果就是和 C 一样

这种东西,拿出来聊聊好,这么一讨论,相信看过帖的人,终身就不会忘记,点个赞

重新去读了一下 axe book,确实如此

我觉得挺好的啊,很多 TX 从别的语言转过来的,发现这些差异提醒是很正常的。同样有种被坑感觉的人飘过。

尽量不要这么做,感觉是个坑。

要是程序员的工资按行算...... 我就不信大家非要把一些逻辑全写在一行里面 这种情况就应该 一行一行写代码 不管是 c,还是 ruby

#19 楼 @jyootai 就是前面的=优先级大 于是他遇到了 3, b = 5 这个表达式 在这个表达式里 =优先级大 所以先执行 b=5 哎 少说半句就不明白...

#25 楼 @zj0713001 哈哈。。。机智。。

user = User.find(1),
school = School.find(1)

你猜猜 user 是啥?

看到逗号没有?

#27 楼 @davidqhr [User.find(1),School.find(1)] 又了解一种 👏

#9 楼 @chiangdi a = 3 空白 = [3, b = 5] b = 5 这样的结果吧?

#29 楼 @hexawing 没有没有,空格是不能做变量名的,当然不能给空格赋值。看 15 楼的解释。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号