Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Couldn't understand the difference between `puts{}.class` and `puts({}.class)`

Tags:

ruby

As the anonymous block and hash block looks like approximately same. I was doing kind of playing with it. And doing do I reached to some serious observations as below:

{}.class
#=> Hash

Okay,It's cool. empty block is considered as Hash.

print{}.class
#=> NilClass
puts {}.class

#=> NilClass

Now why the above code showing the same as NilClass,but the below code shows the Hash again ?

puts ({}.class)
#Hash
#=> nil
print({}.class)
#Hash=> nil

Could anyone help me here to understand that what's going one above?

I completely disagree with the point of @Lindydancer

How would you explain the below lines:

print {}.class
#NilClass
print [].class
#Array=> nil
print (1..2).class
#Range=> nil

Why not the same with the below print [].class and print (1..2).class?

EDIT

When ambiguity happens with local variable and method call, Ruby throws an error about the fact as below :

name
#NameError: undefined local variable or method `name' for main:Object
#        from (irb):1
#        from C:/Ruby193/bin/irb:12:in `<main>'

Now not the same happens with {} (as there is also an ambiguity between empty code block or Hash block). As IRB also here not sure if it's a empty block or Hash. Then why the error didn't throw up when IRB encountered print {}.class or {}.class?

like image 311
Arup Rakshit Avatar asked Dec 26 '22 07:12

Arup Rakshit


1 Answers

The precedence rules of ruby makes print{}.class interpreted as (print{}).class. As print apparently returns a nil the class method returns #NilClass.

EDIT: As been discussed on other answers and in the updates to the question, print{} it of course interpreted as calling print with a block, not a hash. However, this is still about precedence as {} binds stronger than [] and (1..2) (and stronger than do ... end for that matter).

like image 89
Lindydancer Avatar answered Feb 15 '23 23:02

Lindydancer