2015-02-12 15 views
5

Chúng tôi không thể chuyển đối số từ khóa dưới dạng băm bằng các khóa chuỗi, đối số từ khóa chỉ hoạt động với băm làm khóa biểu tượng.Tại sao các đối số từ khóa phải được chuyển dưới dạng băm với các phím biểu tượng, không phải là các khóa chuỗi trong Ruby?

Một ví dụ đơn giản:

def my_method(first_name:, last_name:) 
    puts "first_name: #{first_name} | last_name: #{last_name}" 
end 

my_method({last_name: 'Sehrawat', first_name: 'Manoj'}) 
#=> first_name: Manoj | last_name: Sehrawat 

my_method({first_name: 'Bob', last_name: 'Marley'}) 
#=> first_name: Bob | last_name: Marley 

my_method({'first_name' => 'Kumar', 'last_name' => 'Manoj'}) 
#=> Error: missing keywords: first_name, last_name (ArgumentError) 

lý do đằng sau nó là gì?

+0

Tôi nghĩ rằng ý tưởng này là tương tự như http://stackoverflow.com/questions/8189416/why- use-symbols-as-hash-keys-in-ruby – freemanoid

+0

@freemanoid Tôi không nghĩ vậy. Trong trường hợp này, cú pháp là về cách chấp nhận một biến cục bộ. Không có biểu tượng nào liên quan. – sawa

Trả lời

1

Mặc dù đối số từ khóa có thể được thông qua trong một hash, tôi nghĩ rằng việc sử dụng chủ yếu đích là sử dụng key: value cú pháp trực tiếp:

my_method(first_name: 'Bob', last_name: 'Marley') 

Theo như hình thức này là có liên quan, không có phím biểu tượng (hoặc phím mảng) tại đây. Cú pháp key: value là trực tiếp biểu thị các đối số từ khóa.

Suy đoán của tôi là, vì cú pháp này trùng với băm với các phím biểu tượng và dấu ngoặc bỏ qua, nên cũng chấp nhận các cặp giá trị từ khóa thông qua băm với các phím biểu tượng. Và nó có thể là trường hợp nó được thiết kế để được thực hiện tương thích với các trick đi qua một băm với các phím biểu tượng, được sử dụng trước khi cú pháp này được giới thiệu.

+0

Có thể sai. Xin lỗi nếu nó là. – sawa

+1

Cú pháp 'symbol: key' trong 1.9 thực sự được giới thiệu * cụ thể * như một đường dẫn di chuyển đối với các đối số từ khóa" thực ". –

2

Phiên bản ngắn sẽ vì Matz nói như vậy - trên rubymine này issue ông bình luận

tôi tiêu cực đối với đề nghị này. Ý kiến ​​của tôi là bạn không nên (hoặc không còn) sử dụng chuỗi như từ khóa.

Vấn đề thực tế là xung quanh điều gì đó xảy ra do hậu quả của việc này, nhưng nếu Matz nói không, điều đó không xảy ra. Tôi không biết liệu anh ta đã giải thích thêm về lý do tại sao anh ta chống lại điều này.

2

Việc thực hiện *** có thể có liên quan:

def gather_arguments(*arguments, **keywords) 
    puts "arguments: #{arguments.inspect}" 
    puts " keywords: #{keywords.inspect}" 
end 

gather_arguments('foo' => 1, bar: 2, 'baz' => 3, qux: 4) 

Output:

arguments: [{"foo"=>1, "baz"=>3}] 
keywords: {:bar=>2, :qux=>4} 
+0

Bạn có nói rằng các phím chuỗi được dành riêng để chúng có thể được phân biệt các đối số từ khóa và được hiểu là một phần của các đối số băm không? Nếu đúng như vậy, tôi không đồng ý. – sawa

+1

@sawa Tôi không nói đây là lý do. Chỉ cần rằng hành vi hiện tại của '*' và '**' sẽ thay đổi (và có thể phá vỡ mã hiện có), nếu các đối số từ khóa bằng các phím chuỗi được cho phép. – Stefan

Các vấn đề liên quan