From: tamouse mailing lists Date: 2012-12-16T08:59:39+09:00 Subject: Re: Ruby quick reference arranged in ASCII sequence? On Sat, Dec 15, 2012 at 5:40 PM, tamouse mailing lists wrote: > On Sat, Dec 15, 2012 at 9:26 AM, Eric Christopherson > wrote: >> On Sat, Dec 15, 2012 at 7:00 AM, Old Grantonian wrote: >>> As a ruby beginner, I would be grateful for any links to a ruby >>> reference that is arranged in ASCII sequence. >> [...] >>> For this line, I would like to find a reference that explains the >>> following items in ASCII sequence: >>> >>> ? >>> == >>> %s >>> : >>> \ >>> printf >>> >>> Probably all of these items would be explained in a good tutorial, but >>> it might take hours to find them. >> >> You might try http://symbolhound.com to search for non-alphanumeric >> things like those, along with the word Ruby to narrow things down. >> > > I don't know where you'd find such a reference, but you could build > one as you go. > > In the meantime, I know you asked for a reference, but the thing > you're wondering about is this: > > var = expr1 ? expr2 : expr3 > > That's known as the "ternary" operator. if expr 1 is true, var gets > the result of expr2, otherwise it gets the result of expr3. If you > unpack this into more typical syntax, you get: > > if expr1 > var = expr2 > else > var = expr3 > end > > The second form is much clearer when reading code, but the first form > saves quite a bit of space and typing. > > The next aspect is to look at the printf statements. These are > actually a really non-ruby way of doing something, this looks a lot > more like C, C++, or php. > > In ruby, everything (ALL THE THINGS!!) are objects. Objects are told > what to do with their data by methods. > > last_name.length==0 ? printf(",") : printf("\"%s\",", last_name) > > So lets break this down. > > last_name.length --- this is telling the object last_name to > return it's length > > == --- this is the equals comparison > > so > last_name.length == 0 > > is asking if last_name is empty. Ruby has a better way of writing this: > > last_name.empty? > > The empty? method simply asks exactly what the previous way was > attempting to find out. empty? is implemented something like this: > > def empty? > self.length == 0 > end > > So why do that? Because this: > > last_name.empty? > > is more readable than the other. It's a direct expression of what you > want to know at that point. > > Now, onwards > > printf(",") > > This starts to get into error territory. Just using this as it is is > incorrect. Not that it would produce a run-time error -- it won't -- > however, it's a gross misunderstanding of the printf method. printf > means "Print with formatting". If you aren't formatting anything, > don't. Use print instead. > > The next part > > printf("\"%s\","," last_name) > > is a slightly more legitimate use of printf, in that the variable > last_name is being formatted as a quoted sting and printed. > > So all in all, what this > > last_name.length==0 ? printf(",") : printf("\"%s\",", last_name) > > means, in pseudo code, is: > > If the last name is empty, > just print a comma > Otherwise, > print the last name surrounded by double quotes > followed by a comma > > Now, that will all work. But it isn't idiomatic ruby. > > print last_name.empty ? "," : "\"#{last_name}\"," > > makes better use of ruby's expressiveness. > > Why learn idioms, you may ask? > > Simple, so you will understand the other speakers of the language you > are trying to learn. If you write code solely by casting about for > examples that might do what you want, and stop looking the moment you > get close, just like your bookshelves that are all wobbly and falling > over because you stopped looking for how to build them when you found > a hammer and nails, your code will rot and fall over as well. And that > might be okay. Crikey, I forgot to explain the last bit: the #{expr} notation inside a double quoted string means to substitute the value of the expression at that point in the string, also known as "interpolation". So: variable = "something" "this string includes the value of #{variable}" would yield "this string includes the value of something" You can put any valid ruby expression inside the braces: "this string includes the value of #{10 * 1024 / 3.1415}" would yield "this string includes the value of 3259.5893681362404"