Trong phương pháp inject
or reduce
, n
đại diện cho một giá trị tích lũy; điều này có nghĩa là kết quả của mỗi lần lặp lại được tích lũy trong biến số n
. Điều này có thể, như trong ví dụ của bạn, tổng hoặc sản phẩm của các phần tử trong mảng.
yield
trả về kết quả của khối, được lưu trữ trong n
và được sử dụng trong các lần lặp tiếp theo. Đây là những gì làm cho kết quả "tích lũy".
a = [ 1, 2, 3 ]
a.sum # inject(0) { |n, v| n + v }
# n == 0; n = 0 + 1
# n == 1; n = 1 + 2
# n == 3; n = 3 + 3
=> 6
Ngoài ra, để tính tổng số bạn cũng có thể viết a.reduce :+
. Điều này làm việc cho bất kỳ hoạt động nhị phân nào. Nếu phương pháp của bạn có tên là symbol
, viết a.reduce :symbol
cũng giống như viết a.reduce { |n, v| n.symbol v }
.
attr
và công ty thực sự là phương pháp. Dưới mui xe, họ tự động xác định các phương pháp cho bạn. Nó sử dụng biểu tượng bạn đã truyền để tìm ra tên của biến cá thể và các phương thức. :member
kết quả trong biến số @member
và các phương thức member
và member =
.
Lý do bạn không thể viết attr_reader @member
là bởi vì @member
không phải là một đối tượng trong chính nó, cũng như không thể chuyển đổi thành biểu tượng; nó thực sự nói với ruby để lấy giá trị của biến cá thể @member
của đối tượng self
, trong đó, ở phạm vi lớp, là chính lớp đó.
Để minh họa:
class Example
@member = :member
attr_accessor @member
end
e = Example.new
e.member = :value
e.member
=> :value
Hãy nhớ rằng việc tiếp cận các biến dụ unset mang nil
, và kể từ khi gia đình attr
phương pháp duy nhất chấp nhận biểu tượng, bạn nhận được: TypeError: nil is not a symbol
.
Về việc sử dụng Symbol, bạn có thể loại sử dụng chúng như chuỗi. Chúng tạo ra các khóa băm tuyệt vời vì các ký hiệu bằng nhau luôn tham chiếu đến cùng một đối tượng, không giống như các chuỗi.
:a.object_id == :a.object_id
=> true
'a'.object_id == 'a'.object_id
=> false
Chúng cũng thường được sử dụng để tham chiếu đến tên phương thức và can actually be converted to Proc
s, có thể được chuyển đến phương pháp. Đây là những gì cho phép chúng tôi viết những thứ như array.map &:to_s
.
Khám phá this article để hiểu thêm về biểu tượng.