Is there a way to combine if and do into a single line? items.each do |item| if current_user.admin? #do stuff end Thanks! -- Posted via http://www.ruby-forum.com/.
items.each { |item| item.stuff? } if current_user.admin? On May 27, 6:17 pm, Mario Gr <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> Is there a way to combine if and do into a single line? > > items.each do |item| if current_user.admin? > #do stuff > end > > Thanks! > -- > Posted viahttp://www.ruby-forum.com/.
Mario Gr wrote:> Is there a way to combine if and do into a single line? > > items.each do |item| if current_user.admin? > #do stuff > end > > Thanks!Freddy Andersen wrote:> items.each { |item| item.stuff? } if current_user.admin?Which you actually COULD write like this too, but I''m not sure if it would be considered easily readable: items.each do |item| #do stuff end if current_user.admin? The {| | } and the ''do'' syntaxes are interchangeable in all ways. More of a Ruby question than a Rails one. -- Posted via http://www.ruby-forum.com/.
Jonathan Rochkind wrote: [...]> The {| | } and the ''do'' syntaxes are interchangeable in all ways.Almost. I''ve run across a couple of cases where one works and the other doesn''t -- one creates a Proc and the other doesn''t, or something like that. But that''s vanishingly rare, and 99 times out of 100, you will not go wrong to treat them as interchangeable.> More > of a Ruby question than a Rails one.Yup. Best, -- Marnen Laibow-Koser http://www.marnen.org marnen-sbuyVjPbboAdnm+yROfE0A@public.gmane.org -- Posted via http://www.ruby-forum.com/.
On May 30, 7:03 pm, Marnen Laibow-Koser <rails-mailing-l...@andreas- s.net> wrote:> Jonathan Rochkind wrote: > > [...] > > > The {| | } and the ''do'' syntaxes are interchangeable in all ways. > > Almost. I''ve run across a couple of cases where one works and the other > doesn''t -- one creates a Proc and the other doesn''t, or something like > that.{} binds more tightly than do..end - in some cases this can lead to your block being passed to the ''wrong'' method: def foo(x) puts "foo #{block_given?}" end def bar puts "bar #{block_given?}" end running foo bar {} outputs bar true foo false but running foo bar do end outputs boo false foo true Fred> But that''s vanishingly rare, and 99 times out of 100, you will > not go wrong to treat them as interchangeable. > > > More > > of a Ruby question than a Rails one. > > Yup. > > Best, > -- > Marnen Laibow-Koserhttp://www.marnen.org > mar...-sbuyVjPbboAdnm+yROfE0A@public.gmane.org > -- > Posted viahttp://www.ruby-forum.com/.
Frederick Cheung wrote:> {} binds more tightly than do..end - in some cases this can lead to > your block being passed to the ''wrong'' method:Interesting, makes sense. Personally, that''s one reason I don''t like making method calls without parens, or doing anything else that relies on non-obvious order-of-evaluation-binding just to save a couple of parens. foo( bar {} ) or foo( bar do end ) will both do the same thing. Although the latter is kind of weird style, if I need a multi-line block for bar, I''d personally just use a temporary var instead. result = bar do end foo(result) But everyone''s got their own style, I guess. Of course you COULD use {||} with multi-lines too, but it would also be stylistically weird in my opinion in that case. foo bar {|a| stuff more stuff } That''s just weird. And if I DID it, I''d still want to put parens in around foo''s argument, which would make it even weirder looking. Jonathan -- Posted via http://www.ruby-forum.com/.