2016-01-02 13 views
9

Tại sao Ruby có các biến toàn cục như $$?Hình cầu của Ruby hữu ích cho điều gì?

Không thể có được hành vi tương tự bằng cách xác định người truy cập và thuộc tính trong Kernel?

Điều này có ngăn chặn việc ghi đè trong các lớp con không?

+2

Bạn có yêu cầu cụ thể về [globals đặc biệt] (http://jimneath.org/2010/01/04/cryptic-ruby-global-variables-and-their-meanings.html) như '$$' v.v. hoặc về các biến toàn cục nói chung? Các hình cầu đặc biệt là một trong những ảnh hưởng trong Ruby đến từ Perl và thực sự có các phương pháp thay thế để có được cùng một thông tin ('Process.id' trong trường hợp' $$ '), được ưa thích trong những ngày này. – mikej

+0

Nói chung là toàn cầu, mặc dù sự tồn tại của $$, $ 0 vv dường như sẽ xử phạt việc sử dụng chúng. –

+2

Có, hành vi tương tự có thể thu được bằng cách xác định các phương thức (accessors) trên Kernel, nhưng "tương tự", để nói rõ ràng, không phải là "giống nhau". Đối với một điều, các cuộc gọi phương thức đắt tiền trong Ruby, ít nhất là so với truy cập một biến toàn cầu. –

Trả lời

0

Câu hỏi này có nhiều phần và do đó có câu trả lời.

Q1.

Tại sao Ruby có các biến toàn cầu như $$?

Ruby mượn từ Perl và LISP. Cả hai đều có các biến toàn cục.

Ruby thừa hưởng triết lý Perl có nhiều cách để làm điều tương tự. Yukihiro Matsumoto - ngày 29 tháng 9 năm 2003

Q2.

Không thể có được hành vi tương tự bằng cách xác định người truy cập và thuộc tính trong hạt nhân?

Có, và chúng đã tồn tại. Tuy nhiên nó có thể được tổ chức rằng có tồn tại các giá trị được lập trình có khả năng ứng dụng toàn cầu và do đó cần phải có phạm vi toàn cầu mà không cần giới thiệu bất kỳ mã trung gian nào.

Mặc dù có thể có nhiều OO hơn để gói gọn những thứ này bên trong một phương thức lớp, câu hỏi sau đó trở nên quan trọng hơn đối với người dùng, sự đơn giản hoặc phong cách. Tên của tệp kịch bản lệnh được truyền cho máy ảo là một bất biến. Cũng như các đối số dòng lệnh. Có rất ít lợi ích thu được bằng cách tóm tắt quyền truy cập vào những giá trị đó thông qua một phương pháp. Một biến toàn cầu là đủ cho mục đích và nhẹ như có thể đạt được.

Q3.

Điều này có ngăn chặn ghi đè trong các lớp con không?

Câu trả lời cho điều này là không xác định đối với tôi.

Cuối cùng, chúng ta đến với câu hỏi yêu cầu trong tiêu đề là gì:

của Ruby globals là gì hữu ích cho?

Người ta có thể theo dõi các bài tập biến trong Ruby qua phương pháp trace_var Kernel:

trace_var :$_, proc {|v| puts "$_ is now '#{v}'" } 
$_ = "hello" 
$_ = ' there' 

đầu ra để STDOUT:

$_ is now 'hello' 
$_ is now ' there' 

Người ta có thể thụ thai của một ứng dụng trong đó có một số sự kiện thay đổi định hướng để một biến có tên là trạng thái $, nói một nguồn cấp dữ liệu GUI hoặc cảm biến, ở đây chỉ cần theo dõi các thay đổi đối với các biến toàn cầu, loại bỏ nhu cầu mã chương trình thực hiện về cơ bản cùng một tính năng.

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