cuốn sách gpt4 ai đã làm

Tìm hiểu sâu về Ruby class_eval và instance_eval

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 16:42:57 30 4
mua khóa gpt4 Nike

lớp_evalinstance_eval Nó hoàn toàn có thể dự đoán được khi xác định các phương thức, v.v. Tôi cũng hiểu sự khác biệt giữa các thể hiện của một lớp và các phần tử đơn của một lớp (còn gọi là các lớp đặc điểm).

Nhưng

Điều duy nhất tôi không thể hiểu được là như sau: Giả sử, vì một số mục đích chính sách, chúng tôi muốn biến một lớp hiện có thành một lớp đơn.

cuối lớp A;
cuối lớp B;

A.class_eval làm
riêng tư :mới
end

B.instance_eval làm
riêng tư :mới
end

Trong cả hai trường hợp tôi đều nhận được

NameError: phương thức không xác định 'mới' cho lớp
Ý bạn là mới?

Vâng, đó chính là điều tôi muốn nói.

Hơn nữa, cả hai biến thể đều cho kết quả như nhau, giống như trong cả hai trường hợp self tất cả đều trỏ tới các đối tượng của lớp

A.class_eval làm
lớp << bản thân
riêng tư :mới
end
end

A. mới
=> NoMethodError: phương thức riêng 'mới' được gọi cho A:Class

B.instance_eval làm
lớp << bản thân
riêng tư :mới
end
end

B.mới
=> NoMethodError: phương thức riêng 'mới' được gọi cho B:Class

Làm thế nào nó có thể được? Bất cứ ai có thể làm sáng tỏ điều này?

câu trả lời hay nhất

Hãy xem self là gì ở đây:

hạng A
đặt self.inspect

lớp << bản thân
đặt self.inspect
end
end

A.class_eval {
đặt self.inspect

lớp << bản thân
đặt self.inspect
end
}

A.instance_eval{
đặt self.inspect

lớp << bản thân
đặt self.inspect
end
}

Chúng tôi nhận được kết quả đầu ra sau:

MỘT
#
MỘT
#
MỘT
#

Phương thức class_eval được định nghĩa cho các mô-đun (và do đó là các lớp) và được đánh giá trong ngữ cảnh của mô-đun (lớp). Phương thức instance_eval được đánh giá trong ngữ cảnh của BasicObject. Trong những trường hợp này, hai (thực ra là ba) có vẻ giống nhau.

Tuy nhiên, tôi biết một thực tế là nếu phương thức nằm trong khối eval创建, thì class_eval sẽ tạo các phương thức cá thể và instance_eval sẽ tạo các phương thức lớp. Đã có một bài viết xuất sắc về quan sát này:

Về ruby ​​​​- Tìm hiểu sâu hơn về Ruby class_eval và instance_eval, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/41022993/

30 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress