Tại sao đôi khi tôi nên sử dụng khối và các lần khác & chặn các hàm bên trong chấp nhận các khối?Sự khác biệt giữa khối và khối trong Ruby
Trả lời
block
chỉ là biến cục bộ, &block
là tham chiếu đến khối được chuyển đến phương thức.
def foo(block = nil)
p block
end
foo # => nil
foo("test") # => test
foo { puts "this block will not be called" } # => nil
def foo(&block)
p block
end
foo # => nil
foo("test") # => ArgumentError: wrong number of arguments (1 for 0)
foo { puts "This block won't get called, but you'll se it referenced as a proc." }
# => #<Proc:[email protected]:20>
Bạn cũng có thể sử dụng &block
khi gọi phương pháp để vượt qua một proc như một khối đến một phương pháp, do đó bạn có thể sử dụng procs cũng giống như bạn sử dụng các khối.
my_proc = proc {|i| i.upcase }
p ["foo", "bar", "baz"].map(&my_proc)
# => ["FOO", "BAR", "BAZ"]
p ["foo", "bar", "baz"].map(my_proc)
# => ArgumentError: wrong number of arguments (1 for 0)
Tên biến block
không có ý nghĩa gì đặc biệt. Bạn có thể sử dụng &strawberries
nếu muốn, ký hiệu là khóa ở đây.
Bạn có thể tìm thấy this article hữu ích.
+1 cho '' '& strawberries''' – raycchan
Tôi sẽ thêm: nó tương tự như cách bạn sử dụng toán tử splat (tức là '*') cho mảng:' def foo (* args) ; other_foo (* args); end' sẽ lấy một mảng đối số tùy ý, và sau đó truyền mảng đó vào hàm gọi bên trong. Với các khối, bạn sẽ làm 'def foo (& block); other_foo (& block); kết thúc' –
Trong danh sách đối số, &whatever
lấy khối được chuyển đến phương thức và kết thúc nó trong đối tượng Proc. Các Proc được lưu trữ trong một biến gọi là whatever
(nơi mà có thể được bất cứ tên nào bạn gõ sau khi ký hiệu và, tất nhiên - thường là "khối"). Sau khi gọi phương thức, cú pháp &whatever
biến Proc thành một khối. Vì vậy, nếu bạn xác định một phương pháp như vậy:
def thing(&block)
thing2 &block
end
Bạn đang xác định một phương thức có khối và sau đó gọi một phương thức khác với khối đó.
Nếu bạn không đặt & trước khi chặn, Ruby sẽ không nhận ra mối quan hệ của nó với "khối" bạn chuyển đến hàm. Dưới đây là một số ví dụ.
def f(x, block); end
f(3) { 2+2 } # gives an error, because "block" is a
# regular second argument (which is missing)
def g(x, &block); end
g(3) { 2+2 } # legal
def h(x); end
h(3) { 2+2 } # legal
Đối với sử dụng sau này trong một hàm:
def x(&block) # x is a 0 param function
y(block) # y is a 1 param function (taking one "Proc")
z(&block) # z is a 0 param function (like x) with the block x received
end
Vì vậy, nếu bạn gọi z(&block)
nó (gần !!) giống như gọi z { yield }
: Bạn chỉ cần vượt qua khối chức năng tiếp theo.
- 1. Sự khác biệt giữa khối đó và khối chỉ định trong RSpec
- 2. Sự khác biệt giữa một hộp cấp khối và hộp cấp khối chính là gì?
- 3. Có sự khác biệt đáng kể giữa các khối trong Ruby vs Groovy không?
- 4. Sự khác biệt của Ruby giữa gửi và instance_eval?
- 5. Sự khác biệt giữa Tiếp tục và Goto trong khối xử lý lỗi
- 6. Trong khối xây dựng mẫu Tridion Link Resolver, sự khác biệt giữa Binary và Multimedia
- 7. Sự khác biệt giữa việc gói một khối thử cuối cùng với khối thử-trừ và ngược lại là gì?
- 8. Sự khác biệt giữa Proc và Lambda
- 9. Phương pháp Ruby, Proc và sự nhầm lẫn khối
- 10. Sự khác biệt hiệu suất giữa các khối và gọi lại là gì?
- 11. Sự khác biệt giữa không hiển thị và khối hiển thị
- 12. Sự khác biệt giữa. và #
- 13. Trong Ruby, sự khác biệt giữa String() và #to_s
- 14. sự khác biệt giữa getChildHtml() và getChildChildHtml() trong Magento
- 15. khối ruby và trả lại thứ gì đó từ khối
- 16. Sự khác biệt giữa bao gồm và chặn trong Jade
- 17. Sự khác biệt giữa Ruby 1.9 và Javascript regexp
- 18. Ruby - Sự khác biệt giữa: biến và @variable
- 19. Sự khác biệt giữa quét và khớp trên chuỗi Ruby
- 20. Sự khác nhau giữa Process.fork và Process.spawn trong Ruby 1.9.2
- 21. Sự khác biệt giữa ";" và "GO" trong T-SQL?
- 22. Sự khác biệt giữa @instance_variable và attr_accessor
- 23. Sự khác biệt giữa --cacert và --capath trong curl?
- 24. Sự khác biệt giữa $ (...) và `...`
- 25. Sự khác biệt giữa = và: =
- 26. Sự khác biệt giữa $ * và $ @
- 27. Sự khác biệt giữa NSInvocation và chặn là gì?
- 28. Sự khác biệt giữa ". +" Và ". +?"
- 29. Sự khác biệt giữa "**/* /" và "** /"?
- 30. Sự khác biệt giữa việc bắt đầu một khối mã trong CSS là gì. [chấm] và bằng # [băm]?
Câu hỏi rất hay @collimarco –