TypeError:没有将nil隐式转换为String

时间:2017-03-29 03:01:46

标签: ruby

尝试在ruby脚本中解码bin文件,但在运行脚本后,我得到以下错误test.rb:57:in read': no implicit conversion of nil into String (TypeError) from script:57:in'

知道可能是什么问题吗?

提前致谢

require 'bindata'

class Decode < BinData::Record # size 4+
  uint32le :record_count
  array    :records, :type => :cube_main_bin_record, :initial_length  => :record_count
end


begin
  f = ARGV[0] unless ARGV[0].nil?
  bin = File.read(f)

  Decode.read(bin).records.each_with_index do |rec, num|
    puts "Record #{num} #{rec.to_binary_s.length}"
    p rec
  end
end

1 个答案:

答案 0 :(得分:1)

因为File.read需要字符串参数,并且f默认为nil,而在没有命令行参数的情况下调用脚本

f = ARGV[0] unless ARGV[0].nil?     # f defaults to nil when ARGV[0] is nil
bin = File.read(f)                  # bin = File.read(nil)   BOOM

以下是您的代码的重构:

...
f = ARGV[0]
abort "filename required" unless f
bin = File.read(f)
...

这些变化可以完成两件事:

  1. 如果在没有所需文件名的情况下调用脚本,它将优雅地中止并解释问题。
  2. 通过移除unless ARGV[0].nil?来简化代码,该代码不做任何有用的操作会对将来维护您的代码的任何人产生误导,包括您自己