【问题标题】:Why does Ruby sometimes throw an error when a function is called with a space before the parentheses?为什么在括号前有空格调用函数时,Ruby 有时会抛出错误?
【发布时间】:2019-12-09 12:39:07
【问题描述】:

我学习 Ruby 的方式是,带括号和不带括号的函数语法都是可以接受的。为什么一些 Ruby 解释器特别想要一个而不是另一个?

def foo(i)
    puts "=" * i.length
    puts i 
    puts "=" * i.length
end

foo "hello" 

=begin
=====
hello
=====
=end

foo ("hello") 
# sometimes ERROR

【问题讨论】:

  • 我不知道有任何 Ruby 会抱怨这一点。对于非模棱两可的参数,括号是完全可选的。您是指 Ruby 与 JRuby 中的“解释器”,还是像 Rubocop 这样的 linter 中的“解释器”?
  • 我不是在谈论 JRuby,我做了一个错误的假设,认为有很多常见的 Ruby 解释器,就像有很多常见的 C 编译器一样。需要明确的是,有时它会抱怨空间,有时则不会。

标签: ruby function syntax parentheses


【解决方案1】:

使用 Ruby 2.6.3 在使用 ruby -w 运行时收到以下警告。

test.rb:1:警告:方法名称后的括号被解释为参数列表,而不是分解的参数

这是指Array Decomposition,您可以在其中将 Array 参数的元素解压缩为单个变量。

def bar((a,b))
  puts "a: #{a}, b: #{b}"
end

# a: first, b: second
bar ['first', 'second', 'third']

def foo (i) 有什么问题? def foo i 是合法的; parenthesis around the arguments are optional。然而def foo (i) 是模棱两可的。它可以解释为单个参数def foo(i) 或数组分解def foo((i))

因为这是模棱两可的,不同的解释器可能有不同的……解释。 ?

【讨论】:

  • 在我研究这个问题之前,我对此一无所知。
  • @RaphaelSpoerri 我从未见过任何 Ruby 代码在函数参数中省略括号,也从未使用数组分解。我希望这是一段早期的语法,它被扔进了垃圾箱并为了向后兼容而留下了。一些旧的编程风格喜欢在 func (args) 之类的所有内容之间放置一个空格,这是合法的,但在 Ruby 中不使用。这些是我建议您避免的语法边缘情况,它们欢迎歧义。调用方法时没有括号是可以的。
  • 你确定是括号而不是空格? def m(x) 不是模棱两可的,但 def m (x) 可能是。就像m(1,2) 有效但m (1,2) 是语法错误一样。你的例子指向了这一点,但它并不明确。
  • @muistooshort 两者兼而有之。 def foo i,没有括号,没有歧义。 def foo(i),没有空格,没有歧义。 def foo (i),既是空格又是括号,模棱两可。它是指def foo(i)(函数名和参数列表之间的额外空格)还是def foo((i))(包括数组分解的参数列表周围没有括号)? Ruby 2.6.2 选择将其解释为前者,可能是因为从未使用数组分解,但有些样式喜欢在每个标记之间放置空格。
  • 当你说“数组分解”时,你的意思是像 ES6 等效的“对象解构”吗?
猜你喜欢
  • 1970-01-01
  • 2017-05-26
  • 2021-12-23
  • 2023-03-19
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
相关资源
最近更新 更多