[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Wrong results using named arguments

Jason Vogel

11/29/2006 4:19:00 PM

Source:

[a.rb]
class A

attr_accessor :id
attr_accessor :name

def initialize(id = nil, name = nil)
@id = id
@name = name
end
end

[test.rb]
require 'a'

a1 = A.new(:name => "test")
a2 = A.new(:name => "test2")

p a1
p a2

Results:
#<A:0x28c2d80 @id={:name=>"test"}, @name=nil>
#<A:0x28c2678 @id={:name=>"test2"}, @name=nil>

I expected:

#<A:0x28c2d80 @id=nil, @name="test">
#<A:0x28c2678 @id=nil, @name="test2">

So what nuby mistake am I making?

Thanks,
Jason

3 Answers

Farrel Lifson

11/29/2006 5:03:00 PM

0

On 29/11/06, Jason Vogel <jasonvogel@gmail.com> wrote:
> Source:
>
> [a.rb]
> class A
>
> attr_accessor :id
> attr_accessor :name
>
> def initialize(id = nil, name = nil)
> @id = id
> @name = name
> end
> end
>
> [test.rb]
> require 'a'
>
> a1 = A.new(:name => "test")
> a2 = A.new(:name => "test2")
>
> p a1
> p a2
>
> Results:
> #<A:0x28c2d80 @id={:name=>"test"}, @name=nil>
> #<A:0x28c2678 @id={:name=>"test2"}, @name=nil>
>
> I expected:
>
> #<A:0x28c2d80 @id=nil, @name="test">
> #<A:0x28c2678 @id=nil, @name="test2">
>
> So what nuby mistake am I making?
>
> Thanks,
> Jason
>
>
>

Ruby really doesn't have named arguments, rather it uses a hash to fake it.

Your initialize method for A should probably be written
def initialize(args)
@id = args[:id]
@name = args[:name]
end

Farrel

Kalman Noel

11/29/2006 5:15:00 PM

0

Jason Vogel:
> class A
>
> attr_accessor :id
> attr_accessor :name
>
> def initialize(id = nil, name = nil)
> @id = id
> @name = name
> end
> end
>
# [...]
> require 'a'
>
> a1 = A.new(:name => "test")
> a2 = A.new(:name => "test2")
>
> p a1
> p a2
>
> Results:
> #<A:0x28c2d80 @id={:name=>"test"}, @name=nil>
> #<A:0x28c2678 @id={:name=>"test2"}, @name=nil>

Your initialize method takes two (optional) arguments, the first of which
is id. In your calls to A.new, you're passing exactly one argument, which
is why id gets set, and name does not. More precisely,

A.new(:name => 'test')

is the same as

A.new({:name => 'test'})

so you're passing a Hash. To achieve what you may want, do

def initialize(opt = {})
@id = opt[:id]
@name = opt[:name]
end

Kalman

Paul Lutus

11/29/2006 5:20:00 PM

0

Jason Vogel wrote:

> Source:
>
> [a.rb]
> class A
>
> attr_accessor :id
> attr_accessor :name
>
> def initialize(id = nil, name = nil)
> @id = id
> @name = name
> end
> end
>
> [test.rb]
> require 'a'
>
> a1 = A.new(:name => "test")
> a2 = A.new(:name => "test2")

As your class is written, you must provide values:

a1 = A.new("id","test")

Do you want to define a hash with key-value pairs? Do it this way:

def initialize(key,value)
@hash = {}
@hash[key] = value
end

In a post like this, always say explicitly what you want to accomplish.

--
Paul Lutus
http://www.ara...