Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

7 흥미로운 루비 코드 예제

새로운 Ruby 트릭, 패턴 및 방법을 배우는 한 가지 방법은 다른 사람들이 작성한 코드를 읽는 것입니다.

하지만 읽을 가치가 있는 흥미로운 코드는 어디에서 찾을 수 있습니까? ?

우리는 많은 오픈 소스 프로젝트와 코딩 챌린지 사이트를 보유하고 있어 자신의 솔루션을 제출하면 다른 개발자의 솔루션을 볼 수 있습니다.

이 문서에서 :

여러분이 좋아할 만한 7가지 예를 모아봤습니다.

또한 이를 최대한 활용하는 데 도움이 되도록 각 예에 대한 몇 가지 설명을 드리겠습니다.

두 숫자의 합

이 예에서 우리는 고유한 숫자의 배열이 주어졌을 때 목표 숫자가 되는 두 숫자의 조합이 있는지 알아내고자 합니다.

코드 :

def sum_eq_n?(arr, n) arr.empty인 경우 true를 반환합니까? &&n ==0 arr.product(arr).reject { |a,b| a ==b }. 아무거나? { |아,비| a + b ==n }끝

product를 사용하고 있기 때문에 흥미롭습니다. 방법이 여기에 있습니다.

이 방법을 사용하면 배열 A의 모든 값을 배열 B의 모든 값과 결합하는 루프 내부에 루프가 있는 것과 같습니다.

카운팅, 매핑 및 찾기

(2,4,6,10)와 같이 산술 시퀀스에서 누락된 숫자를 찾고 싶다고 가정해 보겠습니다. .

숫자의 차이를 계산하는 전략을 사용할 수 있습니다.

[2, 2, 4]

여기서 우리의 목표는 시퀀스가 ​​무엇인지 알아내는 것입니다.

증가 또는 감소 중입니까?

얼마까지?

이 코드는 시퀀스를 나타냅니다.

차이 =[2, 2, 4]차이점.max_by { |n| difference.count(n) }# 2# 이것은 시퀀스에서 숫자 사이의 증가입니다.

순서를 알면 모든 숫자를 비교하여 누락된 숫자를 찾을 수 있습니다.

코드는 다음과 같습니다. :

def find_missing(sequence) 연속 =sequence.each_cons(2) 차이 =연속.map { |a,b| b - a } 시퀀스 =difference.max_by { |n| difference.count(n) } missing_between =연속적인.find { |a,b| (b - a) !=시퀀스 } missing_between.first + sequenceendfind_missing([2,4,6,10])# 8

우리가 힘든 일을 하기 위해 여기에서 얼마나 많은 Ruby 메소드를 사용하고 있는지 세어 보세요 🙂

정규 표현식 예

문자열로 작업하고 패턴을 찾고 싶다면 정규식이 친구입니다.

정답을 맞추는 것이 약간 까다로울 수 있지만 연습이 숙달됩니다!

지금 :

주어진 문자열이 VOWEL에서 NON-VOWEL 문자의 패턴을 따르는지 알아내고 싶다고 가정해 봅시다.

좋아요 :

"아테시유"

그런 다음 match?와 함께 정규식을 사용할 수 있습니다. 이를 알아내는 방법입니다.

코드 예는 다음과 같습니다. :

def alternating_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")# 참

몇 가지 주의사항 :

  1. cycle를 사용합니다. 방법을 사용하여 VOWEL 정규식과 NON-VOWEL 정규식 간에 계속 전환할 수 있습니다.
  2. 문자열을 chars가 있는 문자 배열로 변환합니다. all?을 사용할 수 있도록 방법.

재귀 및 스택 예제

재귀는 솔루션을 진행하기 위한 방법으로 메서드가 여러 번 자신을 호출하는 경우입니다.

많은 흥미로운 문제를 재귀로 해결할 수 있습니다. .

그러나 재귀에는 한계가 있으므로 스택 데이터 구조를 대신 사용할 수 있습니다.

지금 :

주어진 어레이의 "파워 세트"를 찾고자 하는 예를 살펴보겠습니다. Power Set은 어레이에서 생성할 수 있는 모든 하위 집합의 집합입니다.

재귀를 사용한 예는 다음과 같습니다. :

def get_numbers(list, index =0, taken =[]) return [taken] if index ==list.size get_numbers(list, index+1,taken) + get_numbers(list, index+1,taken + [ 목록[인덱스]])endget_numbers([1,2,3])

스택을 사용하여 동일한 문제를 해결했습니다. :

def get_numbers_stack(list) 스택 =[[0, []]] 출력 =[] stack.empty까지? index, taked =stack.pop 다음 출력 <<취한 경우 index ==list.size stack.unshift [인덱스 + 1, 취함] stack.unshift [인덱스 + 1, 취함 + [목록[인덱스]]] end outputend 

여기서 아이디어는 알고리즘의 각 패스에서 숫자를 사용하거나 사용하지 않는다는 것입니다.

우리는 가능한 모든 조합을 생성할 수 있도록 두 가지 결과를 모두 시도합니다. .

각 잎이 솔루션 중 하나인 나무를 상상해 보십시오.

주의해야 할 몇 가지 사항 :

  1. 재귀 솔루션이 더 짧습니다.
  2. 알고리즘의 실제 "진행" 부분(색인 + 1)은 거의 동일합니다.
  3. 우리가 사용하는 스택은 Stack이 없기 때문에 배열일 뿐입니다. Ruby 클래스

메서드 체이닝 예

이것은 Ruby가 얼마나 강력한지 보여주기 때문에 제가 가장 좋아하는 예입니다.

방법을 결합하면 한 방법으로 생성된 출력을 가져와 다른 방법으로 전달할 수 있습니다. .

공장 생산 라인처럼!

일부 원료(입력)로 시작하여 이러한 메소드를 호출하는 과정을 통해 원료를 원하는 결과로 천천히 변형합니다.

예시 :

def long_repetition(string) max =string .chars .chunk(&:itself) .map(&:last) .max_by(&:size) max ? [최대[0], 최대 크기] :["", 0]endlongest_repetition("aaabb")# ["a", 3]

문자열이 주어지면 이 코드는 가장 긴 반복 문자를 찾습니다. .

참고 :

  • 가독성을 극대화하기 위해 이 코드의 형식을 지정하는 방법
  • Symbol#to_proc 사용 패턴(&:size )

Btw, 이것을 "데메테르의 법칙"과 혼동하지 마십시오.

그 "법칙"은 다른 물체의 내부에 접근하는 것입니다.

여기서는 개체만 변환합니다.

색인 예제 사용

항목 컬렉션을 반복하는 동안 현재 인덱스를 사용하시겠습니까?

with_index를 사용할 수 있습니다. 방법.

예시 :

def reverse_alternate(문자열) string.gsub(/[^\s]+/).with_index { |w, idx| idx.even? ? w :w.reverse }endreverse_alternate("사과가 좋다")# "사과가 좋다"

공지 :

  • with_index를 결합합니다. &even? 현재 단어를 바꿔야 하는지 확인하기 위해
  • 블록이 없는 Gsub는 Enumerator를 반환합니다. 개체를 사용하여 다른 메서드와 연결할 수 있습니다.

객체 예

또 다른 흥미로운 방법은 each_with_object입니다. , 그리고 그 친구 with_object .

결과를 보관할 개체가 필요할 때 이 두 가지 방법을 사용할 수 있습니다.

예시 :

def clean_string(str) str .chars .each_with_object([]) { |ch, obj| 채널 =="#" ? obj.pop :obj <<채널 } .joinendclean_string("aaa#b")

이 예에서는 #를 찾을 때 마지막 문자를 삭제하려고 합니다. 기호.

공지 :

  • each_with_object 시작하려는 객체인 인수를 취합니다. 이 인수는 두 번째 블록 매개변수가 됩니다.
  • 문자열을 문자 배열(char ) 그리고 완료되면 문자열로 돌아갑니다(join ).
  • 우리는 무엇을 할지 결정하기 위해 삼항 연산자를 사용하고 있습니다. 이렇게 하면 코드가 더 짧아집니다.

요약

이 기사에서는 더 나은 Ruby 코드를 작성하는 데 도움이 되는 내 주석 및 설명과 함께 몇 가지 흥미로운 코드 예제를 보았습니다.

더 많은 사람들이 즐길 수 있도록 이 기사를 공유하는 것을 잊지 마세요.

읽어주셔서 감사합니다!