2011-09-24 37 views
9

Tôi đã tự hỏi tại sao những người viết thư viện File quyết định tạo ra các đối số xác định chế độ nào được mở trong chuỗi thay vì ký hiệu.Tại sao không phải là đối số cho các biểu tượng File.new thay vì chuỗi?

Ví dụ, đây là cách bây giờ nó là:

f = File.new('file', 'rw') 

Nhưng nó sẽ không phải là một thiết kế tốt hơn để làm

f = File.new('file', :rw) 

hoặc thậm chí

f = File.new(:file, :rw) 

ví dụ ? Đây có vẻ là nơi hoàn hảo để sử dụng chúng vì đối số chắc chắn không cần phải thay đổi.

Tôi muốn biết tại sao nó lại xuất hiện theo cách này.


Cập nhật: Tôi vừa đọc xong a related question about symbols vs. strings và tôi cho rằng sự đồng thuận là biểu tượng không chỉ được biết đến như chuỗi, và mọi người đều được sử dụng để sử dụng chuỗi để lập chỉ mục bảng băm. Tuy nhiên, tôi không nghĩ rằng nó sẽ hợp lệ đối với các nhà thiết kế thư viện chuẩn của Ruby để cầu xin sự thiếu hiểu biết về chủ đề ký hiệu, vì vậy tôi không nghĩ đó là lý do.

+5

Đây có lẽ chỉ là một tạo phẩm lịch sử sẽ quay trở lại 'fopen' trong libc. –

+7

Bạn có gợi ý rằng một biểu tượng duy nhất được định nghĩa cho mỗi hoán vị hợp lệ của các chế độ 'File.new' (' r', 'w',' + ',' a', 'b',' t')? – Gabe

+0

Câu hỏi hay. Có các hằng số như 'Tệp :: RDWR' và' Tệp :: CREAT' mà bạn có thể sử dụng, nhưng tôi không thể tìm thấy tài liệu về nó. 'File' [documentation] (http://www.ruby-doc.org/core/classes/File.html) sử dụng các hằng số này, nhưng không giải thích chúng. – rdvdijk

Trả lời

2

Tôi không có chuyên gia về lịch sử của ruby, nhưng bạn thực sự có ba tùy chọn khi bạn muốn tham số cho một phương thức: chuỗi, ký hiệu và lớp tĩnh.

Ví dụ: xử lý ngoại lệ. Mỗi ngoại lệ thực sự là một loại ngoại lệ của lớp.

ArgumentError.is_a? Class 
=> True 

Vì vậy, bạn có thể có mỗi quyền cho luồng đó là lớp riêng. Nhưng điều đó đòi hỏi nhiều lớp hơn sẽ được tạo ra cho hệ thống.

Điều về biểu tượng là chúng không bao giờ bị xóa. Mỗi biểu tượng bạn tạo ra được giữ nguyên vô thời hạn; đó là lý do tại sao sử dụng phương pháp '.to_sym' nhẹ nhàng không được khuyến khích. Nó dẫn đến rò rỉ bộ nhớ.

Chuỗi chỉ dễ thao tác hơn. Nếu bạn có chế độ đầu vào từ người dùng, bạn sẽ cần một '.to_sym' ở đâu đó trong mã của bạn, hoặc ít nhất, một câu lệnh chuyển đổi lớn. Với một chuỗi, bạn chỉ có thể chuyển trực tiếp đầu vào của người dùng vào phương thức (nếu bạn quá tin cậy, dĩ nhiên).

Ngoài ra, trong C, bạn chuyển một ký tự vào phương pháp tệp i/o. Không có Chars in ruby, chỉ là chuỗi. Nhìn thấy như thế nào ruby ​​được xây dựng trên C, đó có thể là nơi nó đến từ.

1

Nó chỉ đơn giản là một di tích từ các ngôn ngữ trước đó.

+0

Tôi không đồng ý. Bạn có thể sao lưu khiếu nại của mình bằng các ví dụ và bất kỳ tuyên bố nào từ người sáng tạo không? –

+1

Tôi sẽ không tìm kiếm tài liệu cho tất cả các ngôn ngữ cũ và cho bạn thấy tất cả chúng đều sử dụng định dạng chuỗi này, nhưng đây là một ví dụ từ một ngôn ngữ web khác: http://us3.php.net/manual/en/function .fopen.php – weexpectedTHIS

+0

Ok nhưng tại sao PHP làm điều đó?Có phải vì PHP là một ngôn ngữ dựa chủ yếu vào các chuỗi? Có phải vì PHP không hỗ trợ các biểu tượng như Perl? Có phải vì ...? Điều quan trọng nhất là bạn không cung cấp bằng chứng cho thấy đây là câu trả lời thay vì ý kiến ​​của bạn. –

Các vấn đề liên quan