2009-05-28 36 views
7

Có người hỏi về nhà điều hành splat ngày hôm qua, và tôi muốn xem mã nguồn ... sẽ được viết bằng C hay trong Ruby? Nó sẽ được tìm thấy ở đâu?Ruby, Mã nguồn của Splat?

Trả lời

1

Toán tử kết nối không được ghi lại trong tài liệu chính của Ruby như của Ruby 2.4. Tuy nhiên, đó là tính năng cốt lõi của ngôn ngữ và mã nguồn cho toán tử liên kết có thể được tìm thấy trong vm_eval.c dưới rb_yield_splat(VALUE values).

Các unit test cho rb_yield_splat làm cho nó rõ ràng hơn những gì đang xảy ra:

it "yields with passed array's contents" do 
    ret = nil 
    @s.rb_yield_splat([1, 2]) { |x, y| ret = x + y } 
    ret.should == 3 
end 
+0

tuyệt vời, nhưng làm sao bạn biết nguồn gốc ở đâu? –

+0

Tôi [đã tìm kiếm] (https://github.com/ruby/ruby/search?l=C&q=splat&type=&utf8=%E2%9C%93) trong kho lưu trữ Ruby git. Giới hạn tìm kiếm trong các tệp C, sau đó đọc mã nguồn cho đến khi bạn tìm thấy nó. – anothermh

+0

Thật tuyệt vời. Cảm ơn bạn. –

7

Một số tìm kiếm nhanh trên Google được bật lên mà nó được triển khai trong eval.c. Bạn có thể tìm thấy các tham chiếu đến "splat" ở một vài nơi trong tệp, nhưng tôi không đủ quen thuộc với các hoạt động bên trong của Ruby để tạo ra bất kỳ ý nghĩa nào về nó.

+0

Cảm ơn vì điều đó, Martin. Chỉ cố gắng làm cho ý nghĩa của thế giới Ruby. Vì vậy, về cơ bản, nếu nó là ruby ​​và không phải là đường ray, thì nguồn này có lẽ không có trong Ruby, điều này có ý nghĩa. –

+0

Toán tử splat là một phần của ngôn ngữ chính của ruby, không phải là tính năng thư viện. Nó có thể được sử dụng trên bất kỳ đối tượng nào định nghĩa phương thứC#to_ary, nhưng khi được sử dụng để thu thập nhiều giá trị vào một biến duy nhất (như trong 'a, * b = 1,2,3,4,5'), nó sẽ luôn tạo Mảng. – rampion

+0

@Rampion, cảm ơn vì điều đó. Vì vậy, tôi đoán câu hỏi thực sự của tôi sẽ là: có bất kỳ "tính năng thư viện" (mà mã nguồn là trong Ruby) mà không cần một "yêu cầu?" –