5 ms·
Ruby Tips Part 2
- losvedir 13y agoGreat article. One question: > There’s one final use for the splat ( * ); when overriding methods in a subclass and calling super. If it turns out you don’t need the arguments to the method for whatever additional behaviour you’re adding, you can accept all arguments with a bare splat, then a bare super passes all arguments to super. I thought that was the default behavior of super. Isn't it the case that a bare super by default passes all the method's original arguments? I know this has bit me in the past where I've been forced to call `super()` with empty parentheses explicitly to prevent this behavior.
- matsadler 13y agoYou're correct, that is the default behaviour of super. My intention wasn't to say that super only works like that when you've defined the method like `def foo( * )` but rather `def foo( * )` is an alternative to having to name your arguments when you're not even going to use them as they are automatically passed with bare super.
- losvedir 13y agoAh, yes, of course. I understand now. Skimmed a bit too fast there and misunderstood what you were getting at. Thanks!
- sheldor 13y agoI think it would be neat to have a single place for all up-to-date tips/tutorials/techniques regarding Ruby & RoR (like Superhero.js) Excellent resource BTW. Keep them coming.
- kot-behemoth 13y agoThere's http://pineapple.io/tags/ruby-on-rails http://pineapple.io/tags/ruby-on-rails which is getting updated quite regularly!
- matthewmacleod 13y agoSome interesting and useful syntax here! However... I’m also partial to this trick for grabbing just the first element of an array. family, = socket.peeraddr This is the sort of code that really turns me off when I'm digging through Ruby. It adds no clarity and actually looks like a typo. What's wrong with this? family = socket.peeraddr.first It's much clearer what's going on.
- masklinn 13y agoRight. I think it works better in Python — although I'm partial towards `[family] = socket.peeraddr` or adding parens as the comma is a bit hard to see — because it also asserts that the RHS is a single-item iterable (or however many items you have on the left-hand side: >>> [a] = range(1) >>> [a] = range(2) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: too many values to unpack and it works on any iterable (any object with #to_a in ruby).
- matsadler 13y ago(context: I'm the author) I do agree with you, but through some failing of my own I still quite enjoy that trick. I included it to highlight the syntax, but I'll add a note saying it's maybe not the best idea to actually use it.
- garethadams 13y agoI often use it when I'm running through code in a console. I put it in production code once, but removed it when I realised the "# This comma is important" comment was longer than just using `.first`
- ottbot 13y agoIt could be more readable if you use a placeholder variable family, _ = socket.peeraddr Which is more clear to me, but maybe not as much as just using .first
- Xylakant 13y agoThe first,_ = list syntax also works when you're reading the two first items: first,second,_ = list
- daviddavis 13y agoYou have to be careful with using Array() to transform a non-array into an array. Suppose for example you wanted an array of hashes: >> Array([{:a => "b"}]) => [{:a=>"b"}] >> Array({:a => "b"}) => [[:a, "b"]] It doesn't work as you might expect with a Hash. I'd probably recommend sticking with something like either of these unless you know you aren't going to be getting a Hash: a = [a] unless a.is_a?(Array) # option 1 a = [*a] # option 2
- molf 13y agoOr `Array.wrap` if you're using Rails.
- ultimoo 13y agoNice write-up about some nifty tricks! Ruby tricks blogs are dime a dozen but I really enjoyed this post as well as Part 1 which was posted here few weeks ago. Looking forward to the rest of the series!
- dayyan 13y agoSome of these "tricks" contradict the Ruby language philosophy.
- timblair 13y agoCare to give some examples where you think this is the case?