10 thủ thuật Ruby mà bạn chưa từng thấy

169

1. Deep copy

Khi bạn copy một object mà bên trong nó có chứa những object khác, ví dụ như là một Array, thì đơn thuần bạn chỉ copy tham chiếu đến các object đó.

Bạn có thể xem nó ở hành động dưới đây:

Sử dụng Marshal (thường được dùng cho serialization) bạn có thể tạo ra một deep copy của một object.

Và kết quả như sau:

Bonus: Sự khác biệt giữa clonedup (bản chất thì tương đương nhau nhưng mà clone có 2 điểm mà dupkhông có):

  • Sao chép cả singleton class của object được sao chép
  • Duy trì trạng thái frozen của object được sao chép.

Ví dụ:

  • Singleton methods

  • Trạng thái Frozen

2. Các cách khác nhau để call một lambda

Cách đầu tiên là cách được hầu hết mọi người sử dụng => bạn cũng chỉ cần nhớ đến cách đó là đủ.

3. Tạo mảng các phần tử có sẵn

Nó sẽ tạo ra một mảng chứa 10 phẩn tử có giá trị random từ 0 đến 299

4. Lambdas quản lý rất nghiêm các tham số truyền vào, nhưng Procs thì không quan tâm đến điều đó

5. Thực thi code trực tiếp mà không cần đến irb hay files

Ruby command có rất nhiều option cho bạn lựa chọn, bạn có thể xem bằng lệnh:

Với flag -e bạn có thể thực thi được một đoạn mã ngắn gửi vào trong đó:

6. Sử dụng mini-irb trong một lệnh

Có bao giờ bạn tự hỏi rằng irb hoạt động như thế nào? Dưới đây là một version vô cùng đơn giản của nó

Bạn sẽ không thấy được sự nhắc nhở nào, tuy nhiên hãy gõ gõ các lệnh ruby ở đây (để kết thúc gõ exit, hoặc ctrl+c)

7. Unfreeze một object (cái này rất nguy hiểm)

Ruby không có bất kì một method nào để unfreeze một object, nhưng sử dụng Fiddle class bạn có thể vào Ruby internals để làm cho nó có thể xảy ra.

8. Object với identity đặc biệt

Ruby object có một identitier hoặc số id để bạn có thể truy cập sử dụng phương thức object_id. Một số object có object_id cố định như : Fixnums, true, false & nil.

Fixnum ids sử dụng công thức: (number * 2) + 1
Bonus: Maximum của Fixnum là 1073741823, sau đó bạn sẽ có 1 object Bignum

9. Tránh dùng output lớn trong irb hoặc pry

Nếu bạn đang làm việc với irb và muốn tránh điền vào màn hình của bạn một contents lớn như là một array hay một string lớn, bạn có thể nối thêm ; ở cuối dòng code của bạn
Ví dụ

Hãy thử với trường hợp không có ; và xem sự khác biệt của nó.

10. Sử dụng caller method để lấy call stack hiện tại

Xem ví dụ sau

Và output sẽ như sau

Nếu bạn cần tên phương thức hiện tại, bạn có thể dùng __method__ hoặc __callee__.

Nguồn: blog.topdev.vn via viblo.asia

SHARE