Forum: Ruby Nuby - NEW case/when question

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
unknown (Guest)
on 2006-03-01 23:50
(Received via mailing list)
I have a new question regarding _why's post [1].

[1] http://redhanded.hobix.com/bits/wonderOfTheWhenBeFlat.html

In the comments he explains that */asterisk is now being used as a
replacement for the method #to_a. But I don't see how that's true.
Let's look at an example.

irb(main):001:0> @r1 = (0..10)
=> 0..10
irb(main):002:0> @r2 = (11..20)
=> 11..20
irb(main):003:0> def foo a
irb(main):004:1> case a
irb(main):005:2> when *@r1
irb(main):006:2> puts "#{a} in range r1"
irb(main):007:2> when @r2.to_a
irb(main):008:2> puts "#{a} in range r2"
irb(main):009:2> else
irb(main):010:2* puts "#{a} NOT in any defined range"
irb(main):011:2> end
irb(main):012:1> end
=> nil
irb(main):013:0> foo 3
3 in range r1
=> nil
irb(main):014:0> foo 12
12 NOT in any defined range
=> nil

If * is really equivalent to #to_a in this case, then the second
"when" test should succeed when passed argument 12, right? As can be
seen from the output, it triggers the else clause.

I looked up * in the 2nd Ed PickAxe and it doesn't cover this
functionality at all. It talks about * being used in patterns and in
coalescing method argument lists.
unknown (Guest)
on 2006-03-02 00:58
(Received via mailing list)
removed_email_address@domain.invalid wrote:
> I have a new question regarding _why's post [1].
>
> [1] http://redhanded.hobix.com/bits/wonderOfTheWhenBeFlat.html
>
> In the comments he explains that */asterisk is now being used as a
> replacement for the method #to_a. But I don't see how that's true.

In the comment, he's talking about something different, not case/when
related. (Using the splat with array construction instead of using
Object#to_a to convert a non-array object to a single-element array.)

In case/when, it's instead of if ... include?.

case name
when *board_members
when *historians

vs.

if board_members.include?(name)
elsif historians.include?(name)
....

Cheers,
Dave
This topic is locked and can not be replied to.