Thursday, 15 January 2015

syntax - Why sometimes Ruby mistakes hash literals with blocks -



syntax - Why sometimes Ruby mistakes hash literals with blocks -

this works:

[1, 2].inject({}) |result, item| end

this works:

[1, 2].inject hash.new |result, item| end

this throws syntaxerror:

[1, 2].inject {} |result, item| end

in cases hash literal {} , hash.new not interchangeable?

any method may called optional block. a block may have form do |params| ... end or form { |params| ... } it idiomatic within ruby community utilize former multiline blocks , latter single-line blocks. blocks not have take parameters, in case can appear either do ... end or { ... }. thus foo {} interpreted either method taking empty hash argument, i.e. foo({}) or method beingness passed empty block, similar foo{ |x| } or foo{ nil }. ruby opts interpret former, leaves illustration method taking 2 blocks, not syntactically valid.

since seem not aware of more terse block syntax, utilize so:

squares = [1,2,3,4,5].map{ |x| x*x } #=> [1,4,9,16,25]

and here's (not-very useful) illustration of legal empty block syntax:

p [1,2,3].map{} #=> [nil,nil,nil]

the block has no statements, , value of lastly look in block nil, each value in block mapped.

ruby syntax

No comments:

Post a Comment