Gandalf StormCrow
Gandalf StormCrow

Reputation: 26202

Ruby hash length or size returns nothing

I'm working on a rake task in ruby :

namespace :generate do
  desc "Export to txt"
  task :txt, [:filename, :item_id] => :environment do |t, args|
    puts "aaaaaaaaaaaaa #{args.length}"
    puts "ssssssss #{args.size}"
    puts "bbbbbbbbbb #{args}"

    args.each do | arg |
        puts "#{arg}"
    end
  end
end

First two puts don't return anything just aaaaaaaaaaa and ssssssss is printed, however bbbbbb print does return my args and even when I go trough each argument they are printed. What am I doing wrong?

update

I started rake task like this :

rake generate:txt[Temp.txt,22]

bbbbbbbbb prints :

bbbbbbbbbb {:filename=>"Temp.txt", :item_id=>"22"}

Each loop prints :

[:filename, "Temp.txt"]
[:item_id, "22"]

Upvotes: 4

Views: 2119

Answers (2)

Dan
Dan

Reputation: 326

You are dealing with an instance of Rake:TaskArguments please see http://rake.rubyforge.org/classes/Rake/TaskArguments.html

If you want to treat it like an enumerable, then call to_hash on it.

namespace :generate do
  desc "Export to txt"
  task :txt, [:filename, :item_id] => :environment do |t, args|
     puts args.class
     puts "aaaaaaaaaaaaa #{args.to_hash.length}"
     puts "size #{args.to_hash.size}"
     puts "bbbbbbbbbb #{args}"
     args.each do | arg |
    puts "#{arg}"
     end
  end
end

Upvotes: 1

mdesantis
mdesantis

Reputation: 8517

args is not an Hash, is a Rake::TaskArguments:

puts args.class #=> Rake::TaskArguments

probably this class doesn't implement size and length; converting to hash works for me:

namespace :generate do
  desc "Export to txt"
  task :txt, [:filename, :item_id] => :environment do |t, args|
    puts "args class: #{args.class}"
    args = args.to_hash
    puts "args to hash: #{args.inspect}"
    puts "aaaaaaaaaaaaa #{args.length}"
    puts "ssssssss #{args.size}"
    puts "bbbbbbbbbb #{args}"

    args.each do | arg |
        puts "#{arg}"
    end
  end
end

prints:

$ rake generate:txt[Temp.txt,22]
Rake::TaskArguments
{:filename=>"Temp.txt", :item_id=>"22"}
aaaaaaaaaaaaa 2
ssssssss 2
bbbbbbbbbb {:filename=>"Temp.txt", :item_id=>"22"}
[:filename, "Temp.txt"]
[:item_id, "22"]

Upvotes: 6

Related Questions