OK, so your speak method does not return anything. when you do `puts Piglet.new.speak + "Hello"` you're saying "print out the return value of Piglet.new.speak and concatenate 'Hello' to it" but there is no reurn value.
when you do `puts Piglet.new.speak` you're saying "call Piglet.new.speak, and print out the return value afterwards". there is no return value. however, when calling Piglet.new.speak, that method itself prints out something
Piglet.new.speak returns nil (as you can probably see in irb), because puts itself returns nil. nil basically means "no return value". if you `puts nil`, you just print an empty line (and return nil again).
Jiaoyin: if you want to change the speak method to return the string, you must return it using the return keyword
it should work exactly as you expect it to, but if you don't know how to expect it to work, maybe just try a little and see? and ask if something doesn't work the way you thought it would
parentheses are used to force an evaluation order, without them standard precedence rules apply
dionysus69: yes, in a way, the case condition is "wrapped" in parentheses before comparison. in the way that it's evaluated as an expression, and not actually a text macro that's substituted before evaluation. I guess you can put it that way