Ruby中Lambda函数内三元运算符无法使用的问题排查
Ruby Lambda斐波那契函数语法错误排查
我尝试用Ruby编写一个Lambda函数来计算第n个斐波那契数,初始代码如下:
fib = -> (n) { n in [1, 2] ? 1 : fib.[n - 1] + fib.[n - 2] }
运行后出现如下错误:
./fib.rb:3: warning: One-line pattern matching is experimental, and the behavior may change in future versions of Ruby! ./fib.rb:3: syntax error, unexpected '?', expecting '}' fib = -> (n) { n in [1, 2] ? 1 : fib.[n - 1] + fib.[n - 2... ./fib.rb:3: syntax error, unexpected ']', expecting '}' ...{ n in [1, 2] ? 1 : fib.[n - 1] + fib.[n - 2] } ./fib.rb:3: syntax error, unexpected ']', expecting '}' ...? 1 : fib.[n - 1] + fib.[n - 2] }
我知道警告是因为使用了in语法,但不明白三元运算符为何报错。参考相关问题修改代码后:
fib = -> (n) { (n in [1, 2]) ? 1 : fib.[n - 1] + fib.[n - 2] }
仍出现语法错误:
./fib.rb:3: warning: One-line pattern matching is experimental, and the behavior may change in future versions of Ruby! ./fib.rb:3: syntax error, unexpected '[' ...(n) { (n in [1, 2]) ? 1 : fib.[n - 1] + fib.[n - 2] } ./fib.rb:3: syntax error, unexpected ']', expecting '}' ...(n in [1, 2]) ? 1 : fib.[n - 1] + fib.[n - 2] } ./fib.rb:3: syntax error, unexpected ']', expecting '}' ...? 1 : fib.[n - 1] + fib.[n - 2] }
请问这是什么原因?
错误原因及修复方案
1. 模式匹配与三元运算符的优先级冲突
Ruby里in操作符的优先级低于三元运算符?:,所以初始代码中的n in [1, 2] ? 1 : ...会被错误解析成n in ([1, 2] ? 1 : ...),完全偏离了你原本的逻辑,直接触发语法错误。你后来给n in [1,2]加括号的做法已经解决了这个优先级问题,但还有第二个关键错误。
2. Lambda调用的语法错误
你写的fib.[n - 1]是错误的Lambda调用方式。Ruby中调用Lambda的正确写法有两种:
- 使用点加括号:
fib.(n - 1) - 直接使用方括号:
fib[n - 1](Lambda原生支持方括号调用语法)
修复后的代码
用点括号调用的版本:
fib = -> (n) { (n in [1, 2]) ? 1 : fib.(n - 1) + fib.(n - 2) }
用方括号调用的版本:
fib = -> (n) { (n in [1, 2]) ? 1 : fib[n - 1] + fib[n - 2] }
额外提示
关于in语法的警告,因为Ruby的单行模式匹配目前还是实验性功能,若想消除警告,可替换为更稳定的条件判断:
fib = -> (n) { [1, 2].include?(n) ? 1 : fib.(n - 1) + fib.(n - 2) }
内容的提问来源于stack exchange,提问作者Shirsak
相关产品推荐
相关产品推荐

