新手问题 判断真假的流程为什么可以是多语句?

u4crella · 2020年05月12日 · 最后由 DaisyWuDi 回复于 2020年06月11日 · 3640 次阅读

ruby 的 while 可以在判断时执行部分操作,这种特性真是让我这种菜鸟感到舒适。比如

list = [1,2,3,2,3,4,2,2,1]
while (a=list.index(2); puts 'hi'; a)
  puts a
  list.delete_at(a)
end # => hi 1 hi 2 hi 4 hi 4 hi

刚才发现 if 也可以。比如

if (list<<4; list.size>5) then puts 'hi' end # => hi

进入正题。我在 python3.7 上发现不能在 if 或 while 的判断流程中设定多语句;而 nodejs 的类似语句我不会写。 所以说这里 while 和 if 接受的对象可以是 bool 或者 Proc 类型吗?感觉 (a=list.index(2); puts 'hi'; a) 就像是个 Proc。 对 ruby 了解还不多,可能有没说清楚的地方,求轻拍。

更新:发现一个有趣的做法,这让我更认定 ruby 的流程的魔幻性了,这个真的非常方便,第一次感受到相对于其他脚本语言的极大的优越性,哈哈。比如

a = 5
puts 'good' if 7==(puts 'hi'; 7 if (a<6)) # => hi good
u4crella 关闭了讨论。 05月12日 22:16
u4crella 重新开启了讨论。 05月12日 22:16

Ruby 这里比较灵活,因为决定puts 'hi'; 7 if (a<6) 这句话的返回值的是 7 if (a<6) 这部分,显然返回值是 7,接着 7==7 成立,于是满足 puts 'good' 的条件,得到了你描述的结果

不过灵活归灵活,这种做法或许可以实现某些非常奇妙的效果,但是,可读性永远是第一位的,也就是,虽然你可以,但是尽量还是不要这样做。

Python 的设计哲学是希望一个事情只有一种做法,所以有时候会显得过于死板了。

作为一名菜鸟,千万别在项目里这么写,不然会被打死。rubocop 了解下

可读性永远是第一位的,人机交流的目标是简单易懂。

Ruby 中,if 或 while 的判断条件部分代码,只要其执行的结果值不是 nil 或 false,判断条件都成立(可以理解为 true)。用小括号包裹的部分,相当于在执行多条语句(分号分隔),其返回值,是最后一条语句的值。你写一个方法,把 list 作为参数,里面执行这部分「a=list.index(2); puts 'hi'; a」代码,把这个方法的返回值作为判断条件,就好理解了。

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