没有将文件隐式转换为字符串

问题描述:

我希望循环浏览json文件的目录并将它们转换为ruby哈希。我的文件looper函数成功抓取每个文件,并且这些文件的格式是正确的。这里是我的代码:没有将文件隐式转换为字符串

def self.update_server 
    if Dir.exist?("log/order_errors") == true 
    logger.debug "#{Dir.entries("log/order_errors")}" 
    Dir.foreach("log/order_errors") { |f| 
     logger.debug "Retrieved #{f}" 
     File.open(f, "r") { |current_file| 
     JSON.parse(current_file) 
     } 
    } 
    else 
    logger.error "Was unable to find the directory specified." 
    end 
end 

是怎么回事还是我需要做整理我的文件,使他们能够正确地解析了什么内容的任何想法?

JSON.parse()需要一个字符串作为参数 - 不是一个文件:

require 'json' 

File.open('data.json') do |f| 
    JSON.parse(f) 
end 

--output:-- 
...no implicit conversion of File into String (TypeError)... 

这是为了做到这一点:

require 'json' 

File.open('data.json') do |f| 
    hash = JSON.parse(f.read) #***HERE*** 
    p hash 
end 

--output:-- 
{"x"=>1, "y"=>2} 

json模块的文档是可怕的,而不幸的是典型的红宝石。文档说parse()的参数是JSON document,这听起来更像是一个文件而不是字符串。文档应该说的是参数需要是json格式的字符串。

顺便说一句,在这一行:

if Dir.exist?("log/order_errors") == true 

...的存在()方法调用是由它的返回值替换,所以如果目录存在红宝石将那条线转换为:

if true == true 

然后Ruby有做对比true == true和Ruby替换的比较结果的比较,即true产生这样的:

现在

,如果你写了这个,而不是:

if Dir.exist?("log/order_errors") 

再次,存在()方法调用是由它的返回值替换,如果目录存在,你会得到这样的:?

if true 

如果该目录不存在,则存在()方法调用由false取代,制造该:

if false 

因此,在存在?()方法调用后编写== true既浪费时间进行输入,又浪费处理时间,因为它需要ruby进行额外的比较。如上所示,您可以在不进行比较的情况下得到相同的结果。规则是:如果一个方法返回true或false,那么在它之后不需要写== true。在ruby中,通常很容易判断方法返回true或false,因为方法名以?结尾。

+0

谢谢!最初在dir.exists?()之后,我做了些什么,但由于某种原因,我改变了这一点。我理解你的想法,而这确实是重复的和不必要的。你所说的json文档相当糟糕。感谢你的解释,我是一个小菜鸟,这对我有很大的帮助。 – James 2015-02-24 16:28:24