观点 1: Ruby3 语法方便、合理。Ruby 语法依然优雅,其语法的一致性、最小惊讶原则依然成立。在众多现代语言中,仍然能靠语法吸引用户。
支持此观点,请点赞此楼
观点 2: Ruby3 部分语法设计不合理。Ruby 语法已经不再那么优雅,甚至部分特性有些糟糕,违反了最小惊讶原则。现代语言几乎都很方便,Ruby 仅靠语法吸引用户的能力在下降。
支持此观点,请点赞此楼
语法糖不管能再好,都不能忘了代码是写给人看的。优雅的前提:保证性能的前提下,尽量追求可读、可维护、可调式。 当然,如果公司的一个技术团队对于语法的理解有一个“共识”基础,那么在这个“共识基础上”尽量的去优化,无可厚非。
有的人喜欢把代码写的短、怪、难,来体现自己的技术。 This is the table 这句话加再多的定语、状语、宾补,它也只表达一个意思。它够简单了、占内存够少了、非常可读了。 又何必用一个不是所有人都懂的 meme 图来“优雅化”它呢
ruby 语法太灵活,导致加新语法容易冲突。然后就这样了…。具体到上面的语法情况:
p a: 2, b: 3
,后面传的是 keyword 参数,被 p 按 hash 收集了(ruby3 的 keywod 参数明确和传值的 positional 参数区分开了,避免了相关参数的歧义)。加{}那个则是和 block 语法冲突了。需要加()避免歧义总的来说,ruby 的特点是多种方式做一件事,充分信任程序员,激发程序员创造力,快乐编程。语法方面的最小惊讶原则,更多体现在熟悉了语言前提下的规则一致性,正交性,而不是可读性(比如上面模式匹配和 hash 简写法就是一致的。问题 3 造成歧义那个的确是 badcase,语法太过灵活还要一致不冲突挺难的)。 可读性和优雅虽然也是 ruby 的特点,但不是靠语言保证的,而是靠激发程序员的创造力,鼓励程序员多尝试,找到优雅的表达方式,是靠程序员和社区规范来保证的。语言本身只是不要成为表达的障碍。
感谢您细致的解释
我觉得恰恰是因为你说的 p( {a: 2, b: 3} )
必须加括号来解决冲突,才导致接纳了 p a: 2, b: 3
这样在函数参数中传递 Hash 字面值的写法,似乎这也是唯一的方式。
而对于语法的一致性来说,我认为 func a: 2, b: 3
怎么讲都应该理解为关键字参数,万万不能当作 Hash. 因为,作为一个代码的阅读者,不应该对这里的函数调用情况感到迷惑,不需要知道到底是 def func(arg)
还是 def func(a:, b:)
。我觉得这个点,虽然是不得已而为之,但永远会被 Rubyist 诟病。
我认为 func a: 2, b: 3 怎么讲都应该理解为关键字参数,万万不能当作 Hash
这个取决于你 func 函数定义,如果你参数定义为 keywords,那他就理解为 kewords,否则就是 Hash。我觉得这个没什么歧义。
=>
这个操作符,这个本来是 Hash 里使用,表示 key value 的意思,不知道为什么又用在这个地方,表达了完全不一样的意思。一开始没考虑这些特性,现在再想加进去,就不得不重复利用已有的运算符,导致看起来不协调、用起来不方便。
这种做法,的确在步 Perl 的后尘,看看 Perl5 后加的 OOP 语法有多难看就知道了。
其实这也说明,语言是有生命周期的,总会有后起之秀更加适应新的时代,进而逐渐取代老的语言。
因为新语言在设计的时候没有历史包袱,当时的业界需要什么、流行什么,它就做什么,不需要瞻前顾后、畏手畏脚。
新手确实没看懂第一个,按模式匹配想了下,还算可以理解,如果懂这个语法写起来是很方便,也很符合意识流向 不爽的地方在于模式匹配的作用域直接是语句所在作用域了...主要还是右赋值的原因,反过来写就不会纠结
说明方法省去括号的情况下,大括号解析成块的优先级高呗。因为散列文字当成一个参数传过去的时候可以省略大括号,没有歧义就直接解析成传参。 因为设计者觉得块比文字更重要
作为一个隔壁的 Elixirist 表示这种语法很 Ruby(能减则减),但清晰度不敢恭维。我现在更看重清晰,因为代码大部分时候是用来读的。
Elixir 版本的例子,匹配都在左边。并且能明确的看到过程中的变量绑定:
def get_user_profile(client) do
%{id: id} = client.get_json("/current_user")
%{nick: nick, bio: bio} = client.get_json("/profile", %{id: id})
%{id: id, nick: nick, bio: bio}
end
个人感觉,如果觉得 pattern 里 %{id: id}
十分繁琐,大可学 JS 弄成 { id }
。Ruby 里面这种语法应该没有歧义。