From: Brian Candler Date: 2009-10-27T18:44:46+09:00 Subject: Re: Array#collect in a method call, not working for me > my_a = [ n ].to_a unless n.class == "Array" I think what you were trying to write is: my_a = n my_a = [ n ] unless n.class == Array There is actually a Ruby idiom for this: my_a = Array(n) Type 'ri Kernel#Array' for more info. This is a normal method which just happens to start with a capital letter, which can be confusing. The Ruby interpreter doesn't confuse this with a constant (or class name) because it is followed by parentheses, so it must be a method call. Another version of your original code would be: my_a = n.is_a?(Array) ? n : [n] However such class tests are very rare in idiomatic Ruby. Duck-typing means you don't care what class an object is, just what methods it responds to. Since the only method you are going to call is 'collect', you could write: my_a = n.respond_to?(:collect) ? n : [n] Then the caller could pass in *any* object which has a 'collect' method, and you would use that. Only if it doesn't would it get wrapped in an Array. The benefit here is that you could pass in an Enumerable object (such as an open file), and you could process its elements as they are read without having to turn the whole file into an Array first. But equally reasonable would be to drop the [n] part altogether, and simply define the method as taking an Enumerable object. It would then be the caller's responsibility to wrap the object if required. def double( n ) n.collect {|num| num * 2 } end puts "\nTest double([1, 2, 3, 4])" inttest = double( [1, 2, 3, 4] ) puts "\n#{inttest}\n\n" puts "\nTest double( [3] )" inttest = double( [3] ) puts "\n#{inttest}\n\n" This is what tends to happen in idiomatic ruby - the number of lines of code becomes extremely small :-) HTH, Brian. -- Posted via http://www.ruby-forum.com/.