Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:意外的“,”,应为关键字_end_Ruby_Syntax_Syntax Error - Fatal编程技术网

Ruby:意外的“,”,应为关键字_end

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

Ruby非常新,无法在这段代码中看到名义上的语法错误:

#! /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