Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"In Ruby there's more than one way of doing the same thing" - what does this mean?

Feel free to delete this topic if it's discussed or quite obvious. I hail from C# background and I'm planning to learn Ruby. Everything I read about it seems quite intriguing. But I'm confused over this basic philosophy of Ruby that "there's more than one way to do one thing". Can someone provide 2 or 3 simple arithmetic or string examples to make this point clear, like if its about the syntaxes or logics etc.

Thanks

like image 615
nawfal Avatar asked Dec 16 '22 12:12

nawfal


1 Answers

"More than one way of doing something" means having the choice of doing something the way you want it. That way you can use various programming styles, no matter what background you're coming from.


Iteration using for vs. blocks

You can iterate over an array of things like so. This is pretty basic, and if you're from a Java background, this feels kind of natural.

for something in an_array
   print something
end

A more Ruby-like way would be the following:

an_array.each do |something|
    print something
end

The first is a rather well known way of doing things. The second one is using blocks, a very powerful concept that you'll find in many Ruby idioms. Basically, the array knows how to iterate over its contents, so you can modify this and add something like:

an_array.each_with_index do |something, index|
    print "At #{index}, there is #{something}"
end

You could have done it like this too, but now you see that the above one looks easier:

index = 0
for something in an_array
    print "At #{index}, there is #{something}"
    index += 1
end

Passing arguments as usual or using Hashes

Normally, you would pass arguments like so:

def foo(arg1, arg2, arg3)
    print "I have three arguments, which are #{arg1}, #{arg2} and #{arg3}"
end

foo("very", "easy", "classic")

=> "I have three arguments, which are very easy and classic"

However, you may also use a Hash to do that:

def foo(args)
    print "I have multiple arguments, they are #{args[:arg1]}, #{args[:arg2]} and #{args[:arg3]}"
end

foo :arg1 => "in a", :arg2 => "hash", :arg3 => "cool"

=> "I have three arguments, which are in a hash and cool"

The second form is one used excessively by Ruby on Rails. The nice thing is that you now have named parameters. When you are passing them, you will more easily remember what they are used for.

like image 52
3 revs Avatar answered May 06 '23 09:05

3 revs