I think my question is more about general syntax, than more about defining/creating methods. In doing one of the excerises in Chris Pine's Learning to Program for Chapter 9, Creating Own Methods, one is to create roman number converter. Below is the program. I added the gets section. # roman number converter # I = 1, V = 5, X = 10, L = 50, C =100, D = 500, M = 1000 puts 'pick a number to convert' num = gets.to_i def roman num roman = '' #assuming creating roman variable that's empty roman = roman + 'M' * (num/1000) #adding Ms to roman variable roman = roman + 'D' * (num%1000/500) roman = roman + 'C' * (num%500/100) roman = roman + 'L' * (num%100/50) roman = roman + 'X' * (num%50/10) roman = roman + 'V' * (num%10/5) roman = roman + 'I' * (num%5/1) roman # don't understand purpose of line end puts roman num I think I get the defining method. I just not clear on what's inside. Specially, the "roman = ''" and the other lines "roman = roman + ..." I think the prior is creating a variable roman that's empty. The later is stating to add how ever many roman number characters is created by dividing num by whatever; like a push for arrays. I don't know what the "roman" at the end of the method does. When removed, I get the same results. Thanks for the help in advance.
on 2012-10-08 04:39
on 2012-10-08 04:48
Hey Richard, So you have it mostly correct: roman = '' initializes the variable 'roman' with the value of an empty String. If you had code like so: roman = '' roman.class It would return String, as in the String class. That prevents the next line, "roman + 'M'" from raising an error. Methods return the last thing they evaluate. That's why the last line of the roman function has the roman variable. It ensures the return value of the roman function is the variable "roman". In this case, you get the same results, sure, but it's possible in some functions the last operation does not return the thing you want. By having the last line explicitly as 'roman' the reader knows the return value of the function is this variable. The line might as well be: return roman Except, often in Ruby, it is considered bad practice to use explicit return statements unless absolutely necessary. Best, -Troy
on 2012-10-08 10:16
Richard D. wrote in post #1078909: > def roman num > roman = '' #assuming creating roman variable that's empty > roman = roman + 'M' * (num/1000) #adding Ms to roman variable > roman = roman + 'D' * (num%1000/500) > roman = roman + 'C' * (num%500/100) > roman = roman + 'L' * (num%100/50) > roman = roman + 'X' * (num%50/10) > roman = roman + 'V' * (num%10/5) > roman = roman + 'I' * (num%5/1) > > roman # don't understand purpose of line > endhanks for the help in advance. Hi, By the way, I wouldn't use a local variable with the same name as the method. That's quite confusing and forces you to use paranthesis or an explicit receiver when you actually do want to call the method. And I would replace the pattern sum = sum + ... with the short form sum += ... That's shorter and (in my opionion) more readable.
on 2012-10-08 15:10
On Sun, Oct 7, 2012 at 9:39 PM, Richard D. <lists@ruby-forum.com> wrote: > roman # don't understand purpose of line > end [snip] > I don't know what the "roman" at the end of the method does. When > removed, I get the same results. > > Thanks for the help in advance. The method returns the result of the last statement. So, in your case, you could leave it out. But you want to get in the habit of specifically returning what you want, because some statements do not return what you expect... def remove_from object_array object object_array.delete(object) end ...returns the object deleted, not the new array. def remove_from object_array object object_array.delete(object) object_array end ..returns the new array Putting object where object_array is to return the object and not the array may seem redundant, but sacrifices little to no overhead or brevity for clarity.
on 2012-10-08 15:24
Todd B. wrote in post #1078942: > The method returns the result of the last statement. So, in your case, > you could leave it out. But you want to get in the habit of > specifically returning what you want, because some statements do not > return what you expect... Isn't that exactly what Troy already said?
on 2012-10-08 16:46
On Mon, Oct 8, 2012 at 8:25 AM, Jan E. <lists@ruby-forum.com> wrote: > Todd B. wrote in post #1078942: >> The method returns the result of the last statement. So, in your case, >> you could leave it out. But you want to get in the habit of >> specifically returning what you want, because some statements do not >> return what you expect... > > Isn't that exactly what Troy already said? Yes, I guess I glossed over that sentence in Troy's reply. In any case, it doesn't hurt to give an example. cheers, Todd
on 2012-10-08 21:25
Todd B. wrote in post #1078942: > def remove_from object_array object > object_array.delete(object) > end > > ...returns the object deleted, not the new array. > > def remove_from object_array object > object_array.delete(object) > object_array > end > > ..returns the new array > > Putting object where object_array is to return the object and not the > array may seem redundant Actually it's not the same; consider the case where the object being deleted doesn't exist in the array. >> [1,2,3].delete(4) => nil
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.