John Joyce wrote:
If it returned nil, then you'd get exceptions and it would be
pointless to have nil respond to to_i
You got it wrong. I'm not asking for #to_i returning nil.
NilClass#to_i shouldn't be there in the first place.
Sure, nil.to_i returning nil could also make sense in a way,
Wrong. See above.
Jeremy McAnally wrote:
I expect to get a converted object or some *Error (TypeError maybe?)
back from any to_* method. Giving me the same object back or nil
doesn't make any sense...
You got it wrong too (am I that confusing? :).
As others have noted, I think the current behavior makes sense: I have
nil (whatever...money, cats, etc.) I'd think an integer representation
would be 0.
nil has other uses besides representing nothing: it means false in a
boolean context.
If nil
Under that logic then zero must evaluate to false, just like C and Python does.
I don't agree with that, of course.
Chand Perrin wrote:
What would you expect it to return, and why would you think that should
be the expected behavior?
I'd expect the same behavior as FalseClass and TrueClass: undefined method.
Because if I want 0 would expect or send 0, not nil.to_i.
Because it doesn't make sense to me that nil, which means false also,
can be represented as zero, when zero doesn't mean false, but true.
Trans wrote:
If it were not for
that convenience we'd have a bunch of these all over the place:
(x ? x.to_i : 0)
Is that so common? Maybe I haven't written that many scripts, but I can't
remember right now somewhere where I needed that. Ok, maybe parsing parameters.
NilClass#to_s actually makes some sense in a context where you want to
serialize objects; "" means exactly nothing (in that context!)
Trans wrote:
def any_method(want_an_integer=nil)
@want_an_integer = want_an_integer.to_i
@want_an_integer + 1 # ... whatever ...
end
It is generally better to use nil for default parameters b/c it
reduces the potential for errors and increases the flexability of the
design. The same is true of using "to_i". If you did it otherwise:
def any_method(want_an_integer=0)
@want_an_integer = want_an_integer
@want_an_integer + 1
end
Errors would occur on calling:
any_method(nil)
and
any_method("0")
And to compensate one would have to put the flexability into the call:
any_method((some_var || 0).to_i)
Which IMO, is much less desirable.
Maybe it's a matter of taste, but I validate parameters before calling methods,
not inside methods. If you feed unexpected parameters to a method, well, you
should get an exception. Right?
mortee wrote:
Well, if you'd like it so much, why not just redefine it in your own
programs? Everyone else seems to expect it to return 0 instead of being
hostile by throwing an exception...
Oh, c'mon ...
Chad Perrin wrote:
How about any circumstance in which one performs some kind of counting
function in code, and operates on the number of whatever is counted,
where no specific value is yet applied to the variable in question until
the first item is counted?
I don't think I understood you. Correct me plese, but I think you're talking
about an accumulator? In that case, you should start from zero, not nil.
···
--
Gerardo Santana