Khi tôi Splat một mảng với *
khi đi qua nó để một phương pháp, sau đó tái tạo lại một mảng từ nó với *
trong phương pháp này, danh tính của mảng không được bảo quản:Đối tượng proc được bảo quản trong `&` -` & `roundtrip như thế nào?
a = []
a.object_id # => 69846339548760
def bar *a; a.object_id end
bar(*a) # => 69846339537540
Tuy nhiên, khi tôi quay một proc thành một khối với &
khi đi qua nó để một phương pháp, sau đó tái tạo lại một proc từ khối với &
trong phương pháp, danh tính của proc dường như được bảo quản:
pr = ->{}
pr.object_id # => 69846339666160
def foo ≺ pr.object_id end
foo(&pr) # => 69846339666160
Làm thế nào là đối tượng proc bảo quản? Không phải là nó bị mất khi nó được chuyển đổi thành một khối? Đây có phải là hành vi được bảo đảm không?
Thậm chí nhiều hơn: 'def baz; đặt Proc.new.object_id kết thúc; p = -> {}; p.object_id # ⇒ 9708320; baz &p ; # ⇒ 9708320' – mudasobwa
@mudasobwa Đó là do một quy ước cú pháp đặc biệt. Khi bạn tạo một proc mà không có một khối trong một phương thức, nó đề cập đến proc được chuyển đến phương thức. – sawa
Tôi biết, cảm ơn bạn. Tôi có nghĩa là 'Proc.new' là trong thực tế _not một constructor_. – mudasobwa