2010-08-21 65 views

Trả lời

18

OK.

Sự khác biệt giữa các = và các toán tử => là lần đầu tiên được gán, thứ hai đại diện cho một liên kết trong một băm (mảng kết hợp). Vì vậy, { :key => 'val' } đang nói "tạo mảng liên kết, với :key là khóa và 'val' là giá trị". Nếu bạn muốn âm thanh như một Rubyist, chúng tôi gọi đây là "băm". (Tin hay không, đây không phải là toán tử lạ nhất trong Ruby; chúng tôi cũng có số <=> hoặc "toán tử tàu vũ trụ").

Bạn có thể nhầm lẫn vì có một phím tắt bạn có thể sử dụng phương pháp, nếu tham số cuối cùng là băm, bạn có thể bỏ qua các dấu ngoặc nhọn ({}). do đó, gọi số render :partial => 'foo' về cơ bản gọi phương thức kết xuất, chuyển một giá trị băm bằng một cặp khóa/giá trị. Bởi vì điều này, bạn thường thấy một băm như tham số cuối cùng để sắp xếp có tham số tùy chọn của một người nghèo (bạn thấy một cái gì đó tương tự được thực hiện trong JavaScript quá).

Trong Ruby, bất kỳ từ thông thường nào là biến cục bộ. Vì vậy, foo bên trong một phương pháp là một biến phạm vi đến mức độ phương pháp. Tiền tố một biến với @ có nghĩa là phạm vi biến cho cá thể. Vì vậy, @foo trong một phương pháp là một mức độ thể hiện.

@@ có nghĩa là biến lớp học, có nghĩa là các biến số @@ nằm trong phạm vi của lớp và tất cả các phiên bản.

: là biểu tượng. Một biểu tượng trong Ruby là một loại chuỗi đặc biệt ngụ ý rằng nó sẽ được sử dụng như một chìa khóa. Nếu bạn đến từ C#/Java, chúng tương tự được sử dụng cho phần chính của một enum. Có một số khác biệt khác nữa, nhưng về cơ bản bất cứ lúc nào bạn sẽ xử lý một chuỗi như bất kỳ loại khóa nào, bạn sử dụng một biểu tượng thay thế.

14

Chà, nhiều khái niệm khác nhau cùng nhau.

1) = là bài tập cũ đơn giản.

a = 4; 
puts a 

2) => được sử dụng để khai báo băm

hash = {'a' => 1, 'b' => 2, 'c' => 3} 
puts hash['b'] # prints 2 

3) @var phép bạn truy cập biến trường hợp đối tượng.

class MyObject 
    def set_x(x) 
     @x = x 
    end 
    def get_x 
     @x 
    end 
end 

o = MyObject.new 
o.set_x 3 
puts o.get_x # prints 3 

4) @@var cho phép bạn truy cập các biến lớp ('tĩnh').

class MyObject 
    def set_x(x) 
     @@x = x # now you can access '@@x' from other MyObject instance 
    end 
    def get_x 
     @@x 
    end 
end 

o1 = MyObject.new 
o1.set_x 3 
o2 = MyObject.new 
puts o2.get_x # prints 3, even though 'set_x' was invoked on different object 

5) Tôi thường nghĩ về :var là lớp 'nhãn' đặc biệt. Ví dụ 2 có thể được rephrased như thế này

hash = {:a => 1, :b => 2, :c => 3} 
puts hash[:b] # prints 2 
+0

ví dụ 3 và 4 gây nhầm lẫn cho tôi, tôi không thể thấy sự khác biệt trong ví dụ 3 và 4. –

+0

@Simon Chạy ví dụ # 4 bằng @x thay vì @@ x và bạn sẽ thấy sự khác biệt –

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