Ruby:意外的“,”,应为关键字_end
Ruby非常新,无法在这段代码中看到名义上的语法错误:Ruby:意外的“,”,应为关键字_end,ruby,syntax,syntax-error,Ruby,Syntax,Syntax Error,Ruby非常新,无法在这段代码中看到名义上的语法错误: #! /usr/bin/env ruby require 'sensu-plugin/metric/cli' class MetricAvailableUpdates < Sensu::Plugin::Met
#! /usr/bin/env ruby
require 'sensu-plugin/metric/cli'
class MetricAvailableUpdates < Sensu::Plugin::Metric::CLI::Graphite
option :scheme,
description: 'Metric naming scheme',
long: '--scheme SCHEME',
short: '-s SCHEME',
default: "#{Socket.gethostname}"
def run
# Get the metrics.
output = %x[/usr/lib/update-notifier/apt-check --human-readable]
output_lines = output.split(/(\n)/)
metrics = {}
updates_pattern = " packages can be updated."
updates = output_lines[0].tr(upgrades_pattern, "").to_i
metrics[:available_updates] = updates
security_updates_pattern = " updates are security updates."
security_updates = output_lines[2].tr(security_updates_pattern, "").to_i
metrics[:available_security_updates] = security_updates
# Print them in graphite format.
metrics.each do |k, v|
output [config[:scheme], k].join('.'), v
end
# Done
ok
end
end
加上括号
如果您稍微转一转,您会注意到,当您注释掉有问题的行时,或者注释掉该行时,语法错误就会消失
output = %x[/usr/lib/update-notifier/apt-check --human-readable]
Ruby解析文件时,需要猜测符号是表示方法调用还是表示变量引用。在这种情况下,输出作为一个变量突然出现,但再往下写
output [config[:scheme], k].join('.'), v
这意味着它突然变成了一个方法调用
我承认Ruby lexer应该给出一个更有用的错误消息……输出是什么?它是父类的一个方法。在细节帮助的情况下,您可以在这里看到输出:我从Graphite继承,所以它是从第21行开始的方法。显示整个文件。添加了完整的文件内容。明天早上当我带着这个代码回到机器前时,我将对此进行一次尝试。我觉得这个答案很有趣,因为我从一段运行的代码中提取了这个each..do循环,位于这里:,您会注意到第120行使用的是与我在代码中实现的完全相同的循环。如果你的解决方案行得通,我会很好奇为什么你可以在其中一个中不加括号,而在另一个中不加括号!我已经把这句冒犯的话注释掉了,我知道这与此有关,但我不确定。这就解释了我的代码和我在对前面答案的评论中提到的mongo示例之间的差异。我正在将一段旧代码与插件框架合并,我没有注意到它们都使用了不同的名称输出。我来自Python,我确实认为Ruby倾向于给出非常神秘的消息。我相信我会逐渐欣赏Ruby在时间思考方面的优势。
output = %x[/usr/lib/update-notifier/apt-check --human-readable]
output [config[:scheme], k].join('.'), v