I know that Struct class defines the [] instance method:

1.9.3p0 :014 > Struct.instance_methods(false)
=>
[:==, :eql?, :hash, :inspect, :to_s, :to_a, :values, :size, :length, :each, :each_pair, :
[], :
[]=, :select, :values_at, :members, :pretty_print, :pretty_print_cycle, :as_json]

This allows you to mimic hash behavior via Struct:

1.9.3p0 :016 > HashLike = Struct.new(:x,:y)
=> HashLike
1.9.3p0 :017 > h = HashLike.new(1,2)
=> #<struct HashLike x=1, y=2>
1.9.3p0 :018 > h[:x]
=> 1
1.9.3p0 :019 > h[:y] = 100
=> 100

But I come across a use case where the square brackets method was used
as instantiation:

1.9.3p0 :001 > Point = Struct.new :x, :y do
1.9.3p0 :002 > def distance(point)
1.9.3p0 :003?> Math.sqrt((point.x - self.x) ** 2 +
1.9.3p0 :004 > (point.y - self.y) ** 2)
1.9.3p0 :005?> end
1.9.3p0 :006?> end
=> Point
1.9.3p0 :007 > Point[3,4].distance Point[0,0]
=> 5.0

That confuses me. How can [] be used both as both hash key accessors
and also instantiation (e.g. new)?

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Search Discussions

  • Ignacio Piantanida at Oct 2, 2012 at 3:09 am
    2012/10/1 John Merlino <stoicism1@aol.com>
    I know that Struct class defines the [] instance method:

    1.9.3p0 :014 > Struct.instance_methods(false)
    =>
    [:==, :eql?, :hash, :inspect, :to_s, :to_a, :values, :size, :length,
    :each, :each_pair, :
    [], :
    []=, :select, :values_at, :members, :pretty_print, :pretty_print_cycle,
    :as_json]

    This allows you to mimic hash behavior via Struct:

    1.9.3p0 :016 > HashLike = Struct.new(:x,:y)
    => HashLike
    1.9.3p0 :017 > h = HashLike.new(1,2)
    => #<struct HashLike x=1, y=2>
    1.9.3p0 :018 > h[:x]
    => 1
    1.9.3p0 :019 > h[:y] = 100
    => 100

    But I come across a use case where the square brackets method was used
    as instantiation:

    1.9.3p0 :001 > Point = Struct.new :x, :y do
    1.9.3p0 :002 > def distance(point)
    1.9.3p0 :003?> Math.sqrt((point.x - self.x) ** 2 +
    1.9.3p0 :004 > (point.y - self.y) ** 2)
    1.9.3p0 :005?> end
    1.9.3p0 :006?> end
    => Point
    1.9.3p0 :007 > Point[3,4].distance Point[0,0]
    => 5.0

    That confuses me. How can [] be used both as both hash key accessors
    and also instantiation (e.g. new)?

    --
    You received this message because you are subscribed to the Google Groups
    "Ruby on Rails: Talk" group.
    To post to this group, send email to rubyonrails-talk@googlegroups.com.
    To unsubscribe from this group, send email to
    rubyonrails-talk+unsubscribe@googlegroups.com.
    For more options, visit https://groups.google.com/groups/opt_out.

    That's because the :[] method is both defined as an instance method and as
    a class method of the Point class.
    Point.singleton_class.instance_methods false
    => [:new, :[], :members]

    --
    Piantanida, Ignacio Julián

    --
    You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
    To post to this group, send email to rubyonrails-talk@googlegroups.com.
    To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
    For more options, visit https://groups.google.com/groups/opt_out.

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouprubyonrails-talk @
categoriesrubyonrails
postedOct 2, '12 at 1:55a
activeOct 2, '12 at 3:09a
posts2
users2
websiterubyonrails.org
irc#RubyOnRails

People

Translate

site design / logo © 2022 Grokbase