2009-01-07 6 views
9

tôi trích ra ví dụ đơn giản:Block Ruby và unparenthesized luận

require 'pp' 
x = 1..3 
pp x.map do |i| {:value => i, :double => (i*2)} end 
pp x.map { |i| {:value => i, :double => (i*2)} } 

pp(x.map do |i| {:value => i, :double => (i*2)} end) 
pp(x.map { |i| {:value => i, :double => (i*2)} }) 

Tôi tự hỏi tại sao trang đầu tiên sản xuất:

[1, 2, 3] 

Trong khi tất cả các oders đang đưa ra:

[{:value=>1, :double=>2}, {:value=>2, :double=>4}, {:value=>3, :double=>6}] 

tôi giả sử nó có liên quan đến quyền ưu tiên của toán tử. Tôi có thể tìm thấy lời giải thích tốt ở đâu?

+2

Đây là bản sao của [Lỗi cú pháp khối Ruby] (http://StackOverflow.Com/q/6854283/), [Khối mã được chuyển đến 'mỗi' hoạt động với dấu ngoặc vuông nhưng không phải với 'do'-'end' (ruby)] (http://StackOverflow.Com/q/6718340/), [Định nghĩa khối - sự khác biệt giữa niềng răng và' do'-'end'?] (http://StackOverflow.Com/q/6179442/), [Ruby multiline block không có 'do'' end'] (http://StackOverflow.Com/q/3680097/), [Sử dụng 'do' block vs brackets' {} ' ] (http://StackOverflow.Com/q/2122380/) và [Sự khác biệt hay giá trị của các kiểu mã hóa khối này trong Ruby là gì?] (http://StackOverflow.Com/q/533008/). –

+0

Các phần của phiên tăng cường sử dụng Ruby-2.2.0 trong ngày đăng bài này. pp_hash = x.map do | i | {: value => i,: double => (i * 2)} kết thúc => [{: value => 1,: double => 2}, {: value => 2,: double => 4} , {: value => 3,: double => 6}] pp_hash.join (",") "{: value => 1,: double => 2}, {: value => 2,: double => 4}, {: value => 3,: double => 6} " có lẽ là mong muốn hơn trong việc sử dụng ngày nay của Json nhưng đó là vấn đề về phong cách chỉ đọc đầu ra. Đôi khi nó không quan trọng mà bạn sẽ đi qua xung quanh miễn là mã của bạn có thể xử lý đúng loại. pp_hash = pp_hash.join (",") –

+0

Đây là những gì tôi thực sự có trước khi đi trên một ốp. Đây là phần đầu tiên trong pry .... [53] pry (chính)> pp x.map do | i | {: key => i,: value => (i * 2)} kết thúc # <ĐTV: ...> => # <ĐTV: ...> –

Trả lời

14

Đó là bởi vì bạn đang gọi điện thoại

pp x.map 

và đi qua một khối để trang (mà bỏ qua nó)

Như đã giải thích trong cuốn sách Programming Ruby

Niềng răng có một ưu tiên cao; có ưu tiên thấp

Vì vậy, hiệu quả, niềng răng buộc vào cuộc gọi hàm gần nhất (x.map) trong khi liên kết với xa nhất (trang). Đó là một chút đơn giản nhưng cần giải thích tình huống này

+0

Cảm ơn @Gareth, bạn có biết bất kỳ tham chiếu chính thức nào không ? Một số đặc tả ngôn ngữ, vv? – rkj