Struct (not) accepting attributes

Discussion in 'Ruby' started by Kero, Oct 18, 2006.

  1. Kero

    Kero Guest

    > Sum = Struct.new:)bla, :"sum(value)")
    > sum = Sum.new(2, 5)

    => #<struct Sum bla=2, :"sum(value)"=5>
    > sum.send:)"sum(value)")

    NoMethodError: undefined method `sum(value)' for #<struct Sum bla=2, :"sum(value)"=5>
    > class X
    > attr_accessor :"sum(value)"
    > end

    NameError: invalid attribute name `sum(value)'
    > class Sum
    > define_method:)"sum(value)") { "summum!" }
    > end

    => #<Proc:0xa7c5f218@(irb):181>
    > sum.send:)"sum(value)")

    => "summum!"

    Not sure this is an error in ruby (1.8.5) or a misunderstanding from me (about Struct).
    And yes, I know how to get/set the value anyway:

    > sum[:"sum(value)"]

    => 5
    > sum["sum(value)"] = 42

    => 42

    Bye,
    Kero.
    Kero, Oct 18, 2006
    #1
    1. Advertising

  2. On 18.10.2006 14:33, Kero wrote:
    >> Sum = Struct.new:)bla, :"sum(value)")
    >> sum = Sum.new(2, 5)

    > => #<struct Sum bla=2, :"sum(value)"=5>
    >> sum.send:)"sum(value)")

    > NoMethodError: undefined method `sum(value)' for #<struct Sum bla=2, :"sum(value)"=5>
    >> class X
    >> attr_accessor :"sum(value)"
    >> end

    > NameError: invalid attribute name `sum(value)'
    >> class Sum
    >> define_method:)"sum(value)") { "summum!" }
    >> end

    > => #<Proc:0xa7c5f218@(irb):181>
    >> sum.send:)"sum(value)")

    > => "summum!"
    >
    > Not sure this is an error in ruby (1.8.5) or a misunderstanding from me (about Struct).


    There is another option: a misunderstanding on your side which attribute
    names can be used in this situation / generally. As you see your sample
    class X does not work either.

    Why don't you just use "sum_value" as attribute name?

    Kind regards

    robert
    Robert Klemme, Oct 18, 2006
    #2
    1. Advertising

  3. Kero

    Jan Svitok Guest

    On 10/18/06, Robert Klemme <> wrote:
    > On 18.10.2006 14:33, Kero wrote:
    > >> Sum = Struct.new:)bla, :"sum(value)")
    > >> sum = Sum.new(2, 5)

    > > => #<struct Sum bla=2, :"sum(value)"=5>
    > >> sum.send:)"sum(value)")

    > > NoMethodError: undefined method `sum(value)' for #<struct Sum bla=2, :"sum(value)"=5>
    > >> class X
    > >> attr_accessor :"sum(value)"
    > >> end

    > > NameError: invalid attribute name `sum(value)'
    > >> class Sum
    > >> define_method:)"sum(value)") { "summum!" }
    > >> end

    > > => #<Proc:0xa7c5f218@(irb):181>
    > >> sum.send:)"sum(value)")

    > > => "summum!"
    > >
    > > Not sure this is an error in ruby (1.8.5) or a misunderstanding from me (about Struct).

    >
    > There is another option: a misunderstanding on your side which attribute
    > names can be used in this situation / generally. As you see your sample
    > class X does not work either.
    >
    > Why don't you just use "sum_value" as attribute name?
    >
    > Kind regards
    >
    > robert


    sum(value) is not a valid method name. method names must match (I
    believe) /[a-z_][a-zA-z0-9_]+[?!]?/

    if you want to have a struct with additional method do this:

    class Sum < Struct.new:)blah)
    def sum(value)
    ...
    end
    end
    Jan Svitok, Oct 18, 2006
    #3
  4. Kero

    Kero Guest

    >>> Sum = Struct.new:)bla, :"sum(value)")
    >>> sum = Sum.new(2, 5)

    >> => #<struct Sum bla=2, :"sum(value)"=5>
    >>> sum.send:)"sum(value)")

    >> NoMethodError: undefined method `sum(value)' for #<struct Sum bla=2, :"sum(value)"=5>
    >>> class X
    >>> attr_accessor :"sum(value)"
    >>> end

    >> NameError: invalid attribute name `sum(value)'
    >>> class Sum
    >>> define_method:)"sum(value)") { "summum!" }
    >>> end

    >> => #<Proc:0xa7c5f218@(irb):181>
    >>> sum.send:)"sum(value)")

    >> => "summum!"
    >>
    >> Not sure this is an error in ruby (1.8.5) or a misunderstanding from me (about Struct).

    >
    > There is another option: a misunderstanding on your side which attribute
    > names can be used in this situation / generally. As you see your sample
    > class X does not work either.


    class X throws an Exception, Struct.new does not.
    1) Because Struct does not use attributes
    2) because it only lost one way (not both) to access the value for my obscure
    symbol name.

    But the define_method *does* work :)
    I can call it w/ #send !
    So I can not do

    irb> class Sum
    irb> define_method:)"sum(value)") { instance_variable_get("@sum(value)") }
    irb> end
    irb> sum.send:)"sum(value)")
    NameError: `@sum(value)' is not allowed as an instance variable name

    but I can do

    irb> class Sum
    irb> define_method:)"sum(value)") { self["sum(value)"] }
    irb> end
    => #<Proc:0xa7c6535c@(irb):21>
    irb> sum.send:)"sum(value)")
    => 5

    so <pedantic> why doesn't Struct? </pedantic> :p

    also, `ruby -dw` does not give a warning for Struct.new:)bla, :"sum(value)").

    > Why don't you just use "sum_value" as attribute name?


    Because "sum(value)" is generated by an SQL query.

    I can't do record_from_db.sum(value), and obviously resolving to #send is
    both too verbose and something I do not desire to explain to anyone as a
    proper API. So record_from_db["sum(value)"] suits me fine.

    This post is food for thought, if anything :)

    Bye,
    Kero.
    Kero, Oct 19, 2006
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Kathy Burke
    Replies:
    0
    Views:
    518
    Kathy Burke
    Nov 14, 2003
  2. cosine... zero
    Replies:
    0
    Views:
    658
    cosine... zero
    Jun 9, 2004
  3. Mad Bull
    Replies:
    3
    Views:
    380
    Rob Meade
    Jul 20, 2006
  4. Chris Fogelklou
    Replies:
    36
    Views:
    1,371
    Chris Fogelklou
    Apr 20, 2004
  5. tshad
    Replies:
    2
    Views:
    355
    Scott Roberts
    Dec 7, 2007
Loading...

Share This Page