[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

How to "break" a "case-when" ?

Iñaki Baz Castillo

4/17/2008 10:18:00 AM

SGksIGlzIG5vdCBwb3NzaWJsZSB0byB0ZXJtaW5hdGUgdGhlIGJvZHkgb2YgYSAid2hlbiIgc3Rh
bWVudD8KCkkgbWVhbjoKCiAgY2FzZSBudW0KICB3aGVuIDE6CiAgICBwdXRzICJJcyAxICEhISEi
CiAgICBicmVhawogICAgcHV0cyAiRG9uJ3Qgd3JpdGUgaXQiCiAgZW5kCgogIHB1dHMgIldyaXRl
IGl0IgoKYnV0IHVuZm9ydHVuYXRlbGx5IHRoZSAiYnJlYWsiIGdpdmVzIGFuIGVycm9yLgoKVGhh
bmtzIGZvciBhbnkgc3VnZ2VzdGlvbi4KCi0tIApJw7Fha2kgQmF6IENhc3RpbGxvCjxpYmNAYWxp
YXgubmV0Pgo=

15 Answers

Peña, Botp

4/17/2008 10:26:00 AM

0

RnJvbTogScOxYWtpIEJheiBDYXN0aWxsbyBbbWFpbHRvOmliY0BhbGlheC5uZXRdIA0KIyBIaSwg
aXMgbm90IHBvc3NpYmxlIHRvIHRlcm1pbmF0ZSB0aGUgYm9keSBvZiBhICJ3aGVuIiBzdGFtZW50
Pw0KIyAgIGNhc2UgbnVtDQojICAgd2hlbiAxOg0KIyAgICAgcHV0cyAiSXMgMSAhISEhIg0KIyAg
ICAgYnJlYWsNCiMgICAgIHB1dHMgIkRvbid0IHdyaXRlIGl0Ig0KIyAgIGVuZA0KIyAgIHB1dHMg
IldyaXRlIGl0Ig0KDQphZmFpaywgbm8uIGJ1dCB3aHkgd291bGQgeW91IHdhbnQgdG8gZG8gdGhh
dD8gYXJlIHlvdSBwb3J0aW5nIGMgY29kZXM/DQoNCmtpbmQgcmVnYXJkcyAtYm90cA0K

Stefan Lang

4/17/2008 10:35:00 AM

0

2008/4/17, I=F1aki Baz Castillo <ibc@aliax.net>:
> Hi, is not possible to terminate the body of a "when" stament?
>
> I mean:
>
> case num
> when 1:
> puts "Is 1 !!!!"
> break
> puts "Don't write it"
> end
>
> puts "Write it"
>
> but unfortunatelly the "break" gives an error.

break is only for iteration. What are you trying to do?
The example you've given is not a compelling use case,
since you can simply remove the line after break.

Also, Ruby's case/when doesn't fall through when clauses.

case 1
when 1
puts "it's 1"
when 2
puts "this is not printed"
end

Stefan

Iñaki Baz Castillo

4/17/2008 10:50:00 AM

0

MjAwOC80LzE3LCBTdGVmYW4gTGFuZyA8cGVyZmVjdGx5Lm5vcm1hbC5oYWNrZXJAZ21haWwuY29t
PjoKCj4gYnJlYWsgaXMgb25seSBmb3IgaXRlcmF0aW9uLiBXaGF0IGFyZSB5b3UgdHJ5aW5nIHRv
IGRvPwo+ICBUaGUgZXhhbXBsZSB5b3UndmUgZ2l2ZW4gaXMgbm90IGEgY29tcGVsbGluZyB1c2Ug
Y2FzZSwKPiAgc2luY2UgeW91IGNhbiBzaW1wbHkgcmVtb3ZlIHRoZSBsaW5lIGFmdGVyIGJyZWFr
LgoKT2ssIEkgd3JpdGUgYSBiZXR0ZXIgZXhhbXBsZToKCgogIHZhciA9IC4uLnNvbWV0aGluZy4u
LgoKIGNhc2UgbnVtCiAgd2hlbiAxOgogICAgcHV0cyAidmFyIG5vdCB2YWxpZCAhISEhISIgaWYg
KCB2YXIgPCAwIHx8IHZhciA+IDEwICkKICAgIGJyZWFrCiAgICBkb19ub3JtYWxfc3R1ZmYKICAg
IC4uLgogICAgLi4uCiAgICBlbmRfbm9ybWFsX3N0dWZmCiAgZW5kCgogIHB1dHMgIldyaXRlIGl0
IgoKCkkganVzdCB3YW50IGRvX25vcm1hbF9zdHVmZiBpbiBjYXNlICJ2YXIiIGlzIHZhbGlkLgpZ
ZXMsIEkgY2FuIHB1dCBhIGJpZyAiaWYiIHN0YW1lbnQgYW5kIHNvIGJ1dCBJIHdvdWxkIGxpa2Ug
bm90IHRvIGRvIGl0CnNpbmNlIGl0IG1ha2VzIGEgYml0IHVnbHkgdGhlIGNvZGUuCgoKLS0gCknD
sWFraSBCYXogQ2FzdGlsbG8KPGliY0BhbGlheC5uZXQ+Cg==

Peter Hickman

4/17/2008 10:58:00 AM

0

Iñaki Baz Castillo wrote:
> 2008/4/17, Stefan Lang <perfectly.normal.hacker@gmail.com>:
>
>
>> break is only for iteration. What are you trying to do?
>> The example you've given is not a compelling use case,
>> since you can simply remove the line after break.
>>
>
> Ok, I write a better example:
>
>
> var = ...something...
>
> case num
> when 1:
> puts "var not valid !!!!!" if ( var < 0 || var > 10 )
> break
> do_normal_stuff
> ...
> ...
> end_normal_stuff
> end
>
> puts "Write it"
>
>
> I just want do_normal_stuff in case "var" is valid.
> Yes, I can put a big "if" stament and so but I would like not to do it
> since it makes a bit ugly the code.
>
>
>

But in this example the code between do_normal_stuff and
end_normal_stuff would never be executed, not even in C!

Why not write something simpler

case num
when 1:
if 0 <= var and var <= 10) then
do_normal_stuff
...
...
end_normal_stuff
puts "Write it"
end


I think you are trying to be too clever here. Stick to the simple stuff.

Iñaki Baz Castillo

4/17/2008 11:15:00 AM

0

MjAwOC80LzE3LCBQZXRlciBIaWNrbWFuIDxwZXRlckBzZW1hbnRpY28uY29tPjoKCj4gIEJ1dCBp
biB0aGlzIGV4YW1wbGUgdGhlIGNvZGUgYmV0d2VlbiBkb19ub3JtYWxfc3R1ZmYgYW5kIGVuZF9u
b3JtYWxfc3R1ZmYKPiB3b3VsZCBuZXZlciBiZSBleGVjdXRlZCwgbm90IGV2ZW4gaW4gQyEKCk9w
c3MsIHNvcnJ5LCBteSBtaXN0YWtlLiBUaGlzIHdvdWxkIGJlOgoKdmFyID0gLi4uc29tZXRoaW5n
Li4uCgogIGNhc2UgbnVtCiAgd2hlbiAxOgogICAgaWYgKCB2YXIgPCAwIHx8IHZhciA+IDEwICkK
ICAgICAgICBwdXRzICJ2YXIgbm90IHZhbGlkICEhISEhIgogICAgICAgIGJyZWFrCiAgICBlbmQK
ICAgIGRvX25vcm1hbF9zdHVmZgogICAgLi4uCiAgICAuLi4KICAgIGVuZF9ub3JtYWxfc3R1ZmYK
ICBlbmQKCiAgcHV0cyAiV3JpdGUgaXQiCgoKCj4gIFdoeSBub3Qgd3JpdGUgc29tZXRoaW5nIHNp
bXBsZXIKPgo+ICBjYXNlIG51bQo+ICB3aGVuIDE6Cj4gICBpZiAwIDw9IHZhciBhbmQgdmFyIDw9
IDEwKSB0aGVuCj4gICAgZG9fbm9ybWFsX3N0dWZmCj4gICAgLi4uCj4gICAgLi4uCj4gICAgZW5k
X25vcm1hbF9zdHVmZgo+ICAgIHB1dHMgIldyaXRlIGl0Igo+ICAgZW5kCgpZZXMsIGJ1dCB3aGF0
IEkgd2FzIHRyeWluZyB0byBhdm9pZCBpcyB0byBlbmNsb3NlIGFsbCB0aGUgInJlYWwiIHN0dWZm
Cm5pIGEgImlmIiBzdGFtZW50IHNpbmNlIGl0J3MgaW4gZmFjdCB0aGUgZGVmYXVsdCBiZWhhdmlv
dXIgYW5kIHRoYXQKd2lsbCBiZSBleGVjdXRlZCA5OSUgb2YgdGltZXMuCgpBbnl3YXkgSSB1bmRl
cnN0YW5kIHRoYXQgaXMgdGhlIG9ubHkgd2F5LgoKVGhhbmtzIGEgbG90IGZvciBhbGwuIDopCgoK
LS0gCknDsWFraSBCYXogQ2FzdGlsbG8KPGliY0BhbGlheC5uZXQ+Cg==

Stefan Lang

4/17/2008 11:17:00 AM

0

2008/4/17, I=F1aki Baz Castillo <ibc@aliax.net>:
> 2008/4/17, Stefan Lang <perfectly.normal.hacker@gmail.com>:
>
>
> > break is only for iteration. What are you trying to do?
> > The example you've given is not a compelling use case,
> > since you can simply remove the line after break.
>
>
> Ok, I write a better example:
>
>
> var =3D ...something...
>
> case num
> when 1:
> puts "var not valid !!!!!" if ( var < 0 || var > 10 )
> break
> do_normal_stuff
> ...
> ...
> end_normal_stuff
> end
>
> puts "Write it"
>
>
> I just want do_normal_stuff in case "var" is valid.
> Yes, I can put a big "if" stament and so but I would like not to do it
> since it makes a bit ugly the code.

Well, since Ruby doesn't support it, you must find other
ways to structure the code in each case. Exceptions might
help in the bigger picture, splitting it up in smaller methods, etc.

You can use catch/throw for this:

catch(:invalid_var) {
case num
when 1
if var < 0 || var > 10
puts "var not valid !!!!!"
throw(:invalid_var)
end
do_normal_stuff
...
...
end_normal_stuff
end
}
puts "Write it"

But be careful, catch/throw is dynamically scoped.
"ri catch" has more info.

Stefan

Iñaki Baz Castillo

4/17/2008 11:26:00 AM

0

MjAwOC80LzE3LCBTdGVmYW4gTGFuZyA8cGVyZmVjdGx5Lm5vcm1hbC5oYWNrZXJAZ21haWwuY29t
PjoKPiBCdXQgYmUgY2FyZWZ1bCwgY2F0Y2gvdGhyb3cgaXMgZHluYW1pY2FsbHkgc2NvcGVkLgo+
ICAicmkgY2F0Y2giIGhhcyBtb3JlIGluZm8uCgp0aGFua3MgZm9yIHRoYXQgaW5mbyA7KQoKLS0g
CknDsWFraSBCYXogQ2FzdGlsbG8KPGliY0BhbGlheC5uZXQ+Cg==

Robert Klemme

4/17/2008 2:14:00 PM

0

2008/4/17, Stefan Lang <perfectly.normal.hacker@gmail.com>:
> 2008/4/17, I=F1aki Baz Castillo <ibc@aliax.net>:
>
> > 2008/4/17, Stefan Lang <perfectly.normal.hacker@gmail.com>:

> Well, since Ruby doesn't support it, you must find other
> ways to structure the code in each case. Exceptions might
> help in the bigger picture, splitting it up in smaller methods, etc.
>
> You can use catch/throw for this:

I would recommend using an "ordinary" exception - because that's what it is=

Peña, Botp

4/18/2008 12:45:00 AM

0

RnJvbTogScOxYWtpIEJheiBDYXN0aWxsbyBbbWFpbHRvOmliY0BhbGlheC5uZXRdIA0KIyB2YXIg
PSAuLi5zb21ldGhpbmcuLi4NCiMgICBjYXNlIG51bQ0KIyAgIHdoZW4gMToNCiMgICAgIGlmICgg
dmFyIDwgMCB8fCB2YXIgPiAxMCApDQojICAgICAgICAgcHV0cyAidmFyIG5vdCB2YWxpZCAhISEh
ISINCiMgICAgICAgICBicmVhaw0KIyAgICAgZW5kDQojICAgICBkb19ub3JtYWxfc3R1ZmYNCiMg
ICAgIC4uLg0KIyAgICAgLi4uDQojICAgICBlbmRfbm9ybWFsX3N0dWZmDQojICAgZW5kDQojICAg
cHV0cyAiV3JpdGUgaXQiDQojLi4uLg0KIyBZZXMsIGJ1dCB3aGF0IEkgd2FzIHRyeWluZyB0byBh
dm9pZCBpcyB0byBlbmNsb3NlIGFsbCB0aGUgInJlYWwiIHN0dWZmDQojIG5pIGEgImlmIiBzdGFt
ZW50IHNpbmNlIGl0J3MgaW4gZmFjdCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgYW5kIHRoYXQNCiMg
d2lsbCBiZSBleGVjdXRlZCA5OSUgb2YgdGltZXMuDQojIEFueXdheSBJIHVuZGVyc3RhbmQgdGhh
dCBpcyB0aGUgb25seSB3YXkuDQoNCmhvdyBhYm91dCBhbm90aGVyIGNhc2Ugd2F5LCANCg0KdmFy
ID0gLi4uc29tZXRoaW5nLi4uDQpjYXNlIA0KICB3aGVuIG51bT09MSBhbmQgKCB2YXIgPCAwIHx8
IHZhciA+IDEwICkNCiAgICAgcHV0cyAidmFyIG5vdCB2YWxpZCBmb3IgbnVtPT0xICEhISEhIg0K
ICB3aGVuIG90aGVyX3N0dWZmX2NvbmRpdGlvbg0KICB3aGVuIC4uLi4NCiAgICAgLi4uDQogIGVs
c2UNCiAgICBlbHNlX3N0dWZmDQplbmQNCnB1dHMgIldyaXRlIGl0Ig0KDQpraW5kIHJlZ2FyZHMg
LWJvdHANCg==

Iñaki Baz Castillo

4/18/2008 6:52:00 PM

0

El Viernes, 18 de Abril de 2008, Pe=C3=B1a, Botp escribi=C3=B3:

> how about another case way,
>
> var =3D ...something...
> case
> when num=3D=3D1 and ( var < 0 || var > 10 )
> puts "var not valid for num=3D=3D1 !!!!!"
> when other_stuff_condition
> when ....
> ...
> else
> else_stuff
> end
> puts "Write it"

opss, I didn't know that a "when" can contain a comparision, nice to know!

Thanks.


=2D-=20
I=C3=B1aki Baz Castillo