2012-11-22 19 views
11

Điều này đã giúp tôi thức giấc vào ban đêm một thời gian.Cú pháp của bí danh Ruby được cho phép như thế nào?

class Foo 
    def bar 
    'bar' 
    end 

    # What the hell is going on here?!? 
    alias :baz :bar 
end 

Foo.new.baz #=> 'bar' 

Tại sao alias lấy 2 biểu tượng làm đối số, nhưng không có dấu phẩy tách chúng? Điều đó dường như không phải là bất kỳ dạng cú pháp hợp lệ nào trong bất kỳ ngữ cảnh nào khác. Và trên thực tế, nếu bạn sử dụng dấu phẩy, nó thực sự là ném lỗi cú pháp.

alias :bar, :baz 
# syntax error, unexpected ',' 

Tuy nhiên, nếu tôi cố gắng để vượt qua 2 biểu tượng trong cùng một cách với phương pháp của riêng tôi, nó cũng phát nổ:

def somemethod(*args) 
    :whatever 
end 
somemethod :a :b 
# syntax error, unexpected ':', expecting $end 
  1. Vì vậy, tại sao phương pháp alias được sử dụng một cú pháp gì khác được sử dụng?
  2. Có thể sử dụng cú pháp này trong bất kỳ ngữ cảnh nào khác không?
  3. Lợi ích của việc sử dụng cú pháp cú pháp kỳ quặc này là gì, khi không có gì khác trong ngôn ngữ hoạt động theo cách này? Tôi thấy không có lợi ích rõ rệt đối với sự không nhất quán về ngôn ngữ này.

Trả lời

17

Lý do alias công trình là bởi vì nó là một từ khóa Ruby, tương tự như class, def, vv Nó không phải là một phương pháp.

Từ khóa alias không cần dấu phẩy bởi vì các nhà thiết kế Ruby đã quyết định không. Từ khóa cơ bản được mã hóa cứng trong trình thông dịch.

Có lý do chính đáng cho alias khi bạn cần chắc chắn bí danh xảy ra tại thời gian phân tích cú pháp, không phải thời gian chạy.

Từ khóa alias có thể gây nhầm lẫn hoặc gây ngạc nhiên. Để phát triển điển hình, tôi tin rằng tốt hơn nên sử dụng phương thức Ruby Module#alias_method, sử dụng dấu phẩy và hoạt động trong thời gian chạy.

Here's a good blog post về aliasalias_method:

Điều này là do alias là một từ khóa và nó được lexically scoped. Nó có nghĩa là nó xử lý self là giá trị của self tại thời điểm mã nguồn đã được đọc. Ngược lại, alias_method xử lý self làm giá trị được xác định tại thời gian chạy.

Nhìn chung, đề xuất của tôi sẽ là sử dụng alias_method. Kể từ alias_method là phương thức được xác định trong lớp Module, nó có thể bị ghi đè sau đó và nó mang lại sự linh hoạt hơn.

+1

Vì vậy, vì đó là một từ khóa, nó cho phép một cú pháp đặc biệt được mã hóa cứng vào trình thông dịch chỉ trong trường hợp này? Đó là loại mùi. –

+0

@ Alex, vâng, nó được mã hóa cứng trong trình thông dịch.Có một lý do chính đáng cho nó đối với một số nhu cầu lập trình bởi vì bạn có thể chắc chắn rằng bí danh xảy ra vào thời gian đọc, không phải thời gian chạy. – joelparkerhenderson

+0

@AlexWayne: Điều tương tự có thể được nói về từ khóa 'else' hoặc từ khóa' case'. Bạn có thực sự nghĩ rằng đó là một mùi thiết kế cho các từ khóa để có cú pháp cụ thể của riêng mình? Tôi muốn thách thức bạn tìm thấy bất kỳ ngôn ngữ lập trình bậc cao nào mà không có từ khóa nào có cú pháp riêng và tất cả chúng đều hoạt động giống như các cuộc gọi phương thức. – Jazz

7

Đây không phải là phương pháp và những đối tượng đó không phải là đối số. alias là một trong số ít từ khóa trong Ruby (xem tất cả here!). Nó làm phiền tôi, vì vậy tôi chuyển sang alias_method (và có other arguments for this).

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