4

ハッシュを生成してファイルに保存するこのrubyスクリプトがあります。

ファイルが存在しない、または空である場合があるので、私は常に最初にファイルの存在を確認します。次に、古い値をハッシュにロードして、もう一度保存してみます。私はこれに長い間苦労してきました。これはサンプルです:

newAppName = ARGV[0]
newApp = Hash.new
newApp["url"] = ARGV[1]
newApp["ports"] = ARGV[2].to_i

apps = Hash.new { |h, k| h[k] = Hash.new }
# apps["test"] = {"url" => "www.test.com", "ports" => 3 }

appsFile = '/home/test/data/apps'

if File.exists?(appsFile)
  apps = Marshal.load File.read(appsFile)
else
  puts "Inserting first app into list..."
end

apps[newAppName] = newApp

serialisedApps = Marshal.dump(apps) # This line is where I get the error

File.open(appsFile, 'w') {|f| f.write(serialisedApps) }

今、私はこのエラーを受け取ります:

script.rb:53:in `dump': can't dump hash with default proc (TypeError)`

どういう意味ですか?私のハッシュは間違っていますか?どうすれば修正できますか?

irbを使用して手動で試してみましたが、Macでテストし、このスクリプトはLinuxで実行されていますが、正常に機能していました。彼らは異なった振る舞いをするべきではありませんよね?

4

1 に答える 1

17

RubyにはMarshalコード用のフォーマットはなく、データ用だけです。Procsまたはラムダをマーシャリングすることはできません。

ハッシュappsには、がありますdefault_proc

hsh = Hash.new { some_block }

多かれ少なかれ同じです

hsh = {}
hsh.default_proc = ->{ some_block }

IOW:appsハッシュにコードが含まれており、コードをマーシャリングできません。

于 2012-11-13T12:40:46.843 に答える