Ruby Tips Part 2
globaldev.co.uk
globaldev.co.uk
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. >>> [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).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.
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`
family, _ = socket.peeraddr
Which is more clear to me, but maybe not as much as just using .first first,_ = list
syntax also works when you're reading the two first items: first,second,_ = list >> 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> 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.
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.
Excellent resource BTW. Keep them coming.