Vâng, bạn không thể sử dụng cú pháp bản ghi nếu bạn không có quyền truy cập vào bản ghi trong thời gian biên dịch.
Nhưng vì hồ sơ được chỉ đơn giản là chuyển đổi thành các bộ trong biên soạn nó chúng ta thực sự dễ dàng để xây dựng chúng bằng tay:
-record(some_rec, {a, b}).
make_record(Rec, Values) ->
list_to_tuple([Rec | Values]).
test() ->
R = make_record(some_rec, ["Hej", 5]), % Dynamically create record
#some_rec{a = A, b = B} = R, % Access it using record syntax
io:format("a = ~p, b = ~p~n", [A, B]).
Hoặc, nếu bạn ở thời gian biên dịch tạo ra một danh sách của tất cả các hồ sơ mà các chức năng nên có thể xây dựng, bạn có thể sử dụng tên trường cũng:
%% List of record info created with record_info macro during compile time
-define(recs,
[
{some_rec, record_info(fields, some_rec)}
]).
make_record_2(Rec, Fields, Values) ->
ValueDict = lists:zip(Fields, Values),
% Look up the record name and fields in record list
Body = lists:map(
fun(Field) ->
proplists:get_value(Field, ValueDict, undefined)
end,
proplists:get_value(Rec, ?recs)),
list_to_tuple([Rec | Body]).
test_2() ->
R = make_record_2(some_rec, [b, a], ["B value", "A value"]),
#some_rec{a = A, b = B} = R,
io:format("a = ~p, b = ~p~n", [A, B]).
với phiên bản thứ hai bạn cũng có thể làm một số kiểm tra để chắc chắn rằng bạn đang sử dụng các lĩnh vực ngay, vv
Các cấu trúc hữu ích khác cần ghi nhớ khi làm việc với các bản ghi động là biểu thức #some_rec.a
đánh giá chỉ mục của trường a
trong some_rec
s và hàm element(N, Tuple)
cho một bộ và một chỉ mục trả về phần tử trong chỉ mục đó.
Chúng được chuyển đổi thành bộ dữ liệu chứ không phải mảng. – ZeissS
Cảm ơn bạn đã sửa. – Zed
cảm ơn bạn, tôi đã học được điều gì đó mới hôm nay – nagaru