Computer >> Máy Tính >  >> Lập trình >> Ruby

7 ví dụ về mã Ruby thú vị

Một cách để học các thủ thuật, mẫu &phương pháp Ruby mới là đọc mã những người khác đã viết.

Nhưng bạn tìm thấy mã thú vị đáng đọc ở đâu ?

Chúng tôi có nhiều dự án mã nguồn mở và các trang web thử thách mã hóa cho phép bạn xem các giải pháp từ các nhà phát triển khác sau khi bạn gửi giải pháp của riêng mình.

Trong bài viết này :

Tôi đã tổng hợp 7 ví dụ mà tôi nghĩ bạn sẽ thích.

Tôi cũng sẽ cung cấp cho bạn một số bình luận về từng ví dụ để giúp bạn khai thác tối đa điều này.

Tổng của hai số

Trong ví dụ này, chúng tôi muốn tìm hiểu xem liệu có một mảng các số duy nhất, có sự kết hợp của hai số sẽ tạo thành một số đích hay không.

:

 def sum_eq_n? (arr, n) trả về true nếu arr.empty? &&n ==0 arr.product (arr) .reject {| a, b | a ==b}. nhiều? {| a, b | a + b ==n} end 

Điều này thật thú vị vì tôi đang sử dụng product tại đây.

Khi bạn sử dụng phương pháp này giống như có một vòng lặp bên trong một vòng lặp kết hợp tất cả các giá trị trong mảng A với tất cả các giá trị trong mảng B.

Đếm, Lập bản đồ &Tìm kiếm

Giả sử bạn muốn tìm số còn thiếu trong một dãy số học, như (2,4,6,10) .

Chúng tôi có thể sử dụng một chiến lược mà chúng tôi tính toán sự khác biệt giữa các con số.

 [2, 2, 4] 

Mục tiêu của chúng tôi ở đây là tìm hiểu trình tự là gì.

Nó đang tăng hay giảm?

Bằng bao nhiêu?

Mã này tiết lộ trình tự:

 chênh lệch =[2, 2, 4] chênh lệch.max_by {| n | chênh lệch.count (n)} # 2 # Đây là sự gia tăng giữa các số trong dãy 

Khi chúng ta biết trình tự, chúng ta có thể so sánh tất cả các số để tìm ra số còn thiếu.

Đây là mã :

 def find_missing (chuỗi) liên tiếp =serial.each_cons (2) khác biệt =liên tiếp.map {| a, b | b - a} dãy =khác biệt.max_by {| n | chênh lệch.count (n)} thiếu_between =liên tiếp.find {| a, b | (b - a)! =sequence} thiếu_between.first + sequenceendfind_missing ([2,4,6,10]) # 8 

Hãy đếm xem chúng tôi đang sử dụng bao nhiêu phương pháp Ruby ở đây để thực hiện công việc khó khăn cho chúng tôi 🙂

Ví dụ về Cụm từ Thông dụng

Nếu bạn đang làm việc với chuỗi và bạn muốn tìm các mẫu thì biểu thức chính quy là bạn của bạn.

Họ có thể hơi khó để làm đúng, nhưng thực hành sẽ làm nên thành thạo!

Bây giờ :

Giả sử chúng tôi muốn tìm hiểu xem một chuỗi nhất định có tuân theo mẫu ký tự VOWEL đến KHÔNG-VOWEL hay không.

Như thế này :

 "ateciyu" 

Sau đó, chúng ta có thể sử dụng một biểu thức chính quy, cùng với match? phương pháp để tìm ra điều này.

Đây là ví dụ về mã :

 def alter_characters? (s) type =[/ [aeiou] /, /[^aeiou]/].cycle if s.start_with? (/ [^ aeiou] /) type.next end s.chars.all? {| ch | ch.match? (type.next)} endalternating_characters? ("ateciyu") # true 

Lưu ý một số điều :

  1. Chúng tôi sử dụng cycle để chúng tôi có thể tiếp tục chuyển đổi giữa regex VOWEL và không phải là VOWEL regex.
  2. Chúng tôi chuyển đổi chuỗi thành một mảng ký tự với các ký tự chars để chúng tôi có thể sử dụng all? phương pháp.

Ví dụ về đệ quy &ngăn xếp

Đệ quy là khi một phương thức gọi chính nó nhiều lần như một cách để đạt được tiến bộ đối với một giải pháp.

Nhiều vấn đề thú vị có thể được giải quyết bằng đệ quy .

Nhưng vì đệ quy có giới hạn của nó, thay vào đó bạn có thể sử dụng cấu trúc dữ liệu ngăn xếp.

Bây giờ :

Hãy xem một ví dụ mà chúng ta muốn tìm ra “Bộ nguồn” của một mảng nhất định. Power Set là một tập hợp tất cả các tập con có thể được tạo từ mảng.

Đây là một ví dụ với đệ quy :

 def get_numbers (danh sách, chỉ mục =0, lấy =[]) trả về [lấy] nếu chỉ mục ==list.size get_numbers (danh sách, chỉ mục + 1, lấy) + get_numbers (danh sách, chỉ mục + 1, lấy + [ list [index]]) endget_numbers ([1,2,3]) 

Đây là vấn đề tương tự được giải quyết bằng cách sử dụng ngăn xếp :

 def get_numbers_stack (list) stack =[[0, []]] output =[] cho đến khi stack.empty? chỉ mục, lấy =stack.pop đầu ra tiếp theo < 

Ý tưởng ở đây là trên mỗi lần vượt qua của thuật toán, chúng ta lấy một số hoặc không lấy một số.

Chúng tôi phân nhánh và thử cả hai kết quả để chúng tôi có thể tạo ra tất cả các kết hợp có thể có .

Hãy tưởng tượng một cái cây mà mỗi chiếc lá là một trong những giải pháp.

Một số điều cần lưu ý :

  1. Giải pháp đệ quy ngắn hơn
  2. Phần "tiến bộ" thực tế của thuật toán (chỉ mục + 1) gần như giống nhau
  3. Ngăn xếp mà chúng tôi đang sử dụng chỉ là một mảng vì không có Stack lớp học trong Ruby

Ví dụ về chuỗi phương pháp

Đây là ví dụ yêu thích của tôi vì nó cho thấy Ruby mạnh như thế nào.

Kết hợp các phương pháp cho phép bạn lấy kết quả được tạo ra bởi một phương pháp và chuyển nó sang một phương pháp khác .

Cũng giống như một dây chuyền sản xuất của nhà máy!

Bạn bắt đầu với một số nguyên liệu thô (đầu vào), sau đó thông qua quá trình gọi các phương thức này, bạn từ từ biến đổi nguyên liệu thô thành kết quả mong muốn.

Đây là một ví dụ :

 def long_repetition (string) max =string .chars .chunk (&:chính nó) .map (&:last) .max_by (&:size) max? [max [0], max.size]:["", 0] endlongest_repetition ("aaabb") # ["a", 3] 

Cho một chuỗi, mã này sẽ tìm ký tự lặp lại dài nhất .

Lưu ý :

  • Cách mã này được định dạng để tối đa hóa khả năng đọc
  • Sử dụng Symbol#to_proc mẫu (&:size )

Btw, đừng nhầm lẫn điều này với "Định luật Demeter".

"Luật" đó là cách tiếp cận bên trong của một đối tượng khác.

Ở đây chúng tôi chỉ chuyển đổi các đối tượng.

Với Ví dụ về Chỉ mục

Bạn có muốn có chỉ mục hiện tại trong khi lặp qua một bộ sưu tập các mục không?

Bạn có thể sử dụng with_index phương pháp.

Đây là một ví dụ :

 def reverse_alternate (string) string.gsub (/ [^ \ s] + /). with_index {| w, idx | idx.even? ? w:w.reverse} endreverse_alternate ("Apples Are Good") # "Apples erA Good" 

Thông báo :

  • Chúng tôi kết hợp with_index &even? để tìm xem chúng ta có phải đảo ngược từ hiện tại không
  • Gsub không có khối trả về Enumerator đối tượng, cho phép bạn liên kết nó với các phương thức khác

Mỗi ví dụ với đối tượng

Một phương pháp thú vị khác là each_with_object và người bạn của nó with_object .

Bạn có thể sử dụng hai phương pháp này khi bạn cần một đối tượng để lưu giữ kết quả.

Đây là một ví dụ :

 def clean_string (str) str .chars .each_with_object ([]) {| ch, obj | ch =="#"? obj.pop:obj < 

Trong ví dụ này, chúng tôi muốn xóa ký tự cuối cùng khi chúng tôi tìm thấy một # biểu tượng.

Thông báo :

  • each_with_object nhận một đối số, là đối tượng mà chúng ta muốn bắt đầu. Đối số này trở thành tham số khối thứ 2.
  • Chúng tôi đang chuyển đổi chuỗi thành một mảng ký tự (char ) &sau đó quay lại một chuỗi khi chúng ta hoàn tất (join ).
  • Chúng tôi đang sử dụng toán tử bậc ba để quyết định phải làm gì, điều này giúp mã ngắn hơn.

Tóm tắt

Trong bài viết này, bạn đã thấy một số ví dụ mã thú vị với phần bình luận và giải thích của tôi để giúp bạn viết mã Ruby tốt hơn.

Đừng quên chia sẻ bài viết này để nhiều người cùng thưởng thức.

Cảm ơn vì đã đọc!