Ruby on Rails Thursday, December 27, 2012

That was my hunch. Thanks for clarifying.

On Wednesday, December 26, 2012 6:48:18 PM UTC-5, Matt Jones wrote:



On Tuesday, 25 December 2012 20:13:16 UTC-5, John Merlino wrote:
ok, it didn't look like nested methods. But I made to believe that
this:

sum<=square*deviation|a

is exactly the same as this:

sum<=(square*(deviation|(a)))

So if this is true, then still a question remains.

 That's not how it parses, thanks to operator precedence - the same reason that 2+5*10+3 parses as 2.+((5.*(10)).+(3)) and not 2.+(5.*(10.+(3))).

 You can use a tool like Ripper (http://www.rubyinside.com/using-ripper-to-see-how-ruby-is-parsing-your-code-5270.html) to see exactly how something is being parsed. Trying your expression yields:

[:program,
 [[:binary,
   [:vcall, [:@ident, "sum", [1, 0]]],
   :<=,
   [:binary,
    [:binary,
     [:vcall, [:@ident, "square", [1, 5]]],
     :*,
     [:vcall, [:@ident, "deviation", [1, 12]]]],
    :|,
    [:vcall, [:@ident, "a", [1, 22]]]]]]]

Or, distilled back to a fully-parenthized code version:

sum <= ((square*deviation) | a)

With the method calls written out explicitly:

sum.<=((square.*(deviation)).|(a))

Essentially, this creates a function that calculates the squared deviation from the mean (square*deviation), applies it to the list a, and then sums the resulting values.

This sort of confusion is why most people recommend avoiding operator overloading in most cases - there are a bunch of precedence rules built into the language, and you're essentially stuck with them.

--Matt Jones

--
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.
To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/Td1UvO4YivgJ.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

No comments:

Post a Comment