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

이전에 본 적 없는 루비 트릭 11가지

멋진 Ruby 트릭을 찾고 계십니까?

찾았습니다!

이 기사에서는 제가 좋아하는 몇 가지를 여러분과 공유하고 싶습니다.

내용

  • 딥 카피 1개
  • 람다를 호출하는 2가지 다른 방법
  • 3 미리 채워진 배열 만들기
  • 4 True, False 및 nil은 개체입니다.
  • 5 Lambda는 인수에 대해 엄격하지만 Proc는 신경 쓰지 않습니다.
  • 6 irb 또는 파일 없이 직접 코드 실행
  • 7 하나의 명령으로 나만의 미니 irb
  • 8 물체 고정 해제(위험!)
  • 특별한 정체성을 지닌 9가지 개체
  • 10 irb 또는 pry에서 큰 출력을 피하십시오.
  • 11 호출자 메서드를 사용하여 현재 호출 스택 가져오기
  • 12 보너스! 모든 값을 부울로 변환
  • 13 보너스! 키워드를 변수 이름으로 사용
  • 14 요약
    • 14.1 관련

딥 카피

copy할 때 Array와 같은 다른 객체를 포함하는 객체 , 이러한 개체에 대한 참조만 복사됩니다.

여기에서 작동하는 것을 볼 수 있습니다.

food =%w( 빵 우유 오렌지 )food.map(&:object_id) # [35401044, 35401020, 35400996]food.clone.map(&:object_id) # [35401044, 35401020, 3540099] 

Marshal 사용 일반적으로 직렬화에 사용되는 클래스를 사용하여 객체의 '딥 카피'를 생성할 수 있습니다.

def deep_copy(obj) Marshal.load(Marshal.dump(obj))end

결과:

deep_copy(음식).map(&:object_id) # [42975648, 42975624, 42975612]

람다를 호출하는 다양한 방법

my_lambda =-> { '안녕하세요' 입력 }my_lambda.callmy_lambda[]my_lambda.()my_lambda.===

가능하면 첫 번째 것을 고수해야 합니다(call ), 대부분의 사람들이 알고 있는 것이기 때문입니다.

미리 채워진 배열 만들기

Array 클래스는 인수 + 블록을 사용할 수 있으며, 이를 통해 n 배열을 생성할 수 있습니다. 집단. 기본적으로 이러한 요소는 nil입니다. , 하지만 블록이 있는 경우 값은 블록에서 가져옵니다.

:

Array.new(10) { 랜드 300 }

그러면 0에서 299 사이의 난수 10개가 있는 배열이 생성됩니다.

True, False 및 nil은 개체입니다.

true.class # TrueClassfalse.class # FalseClassnil.class # NilClass

이 개체의 복사본은 하나만 있으며 원하는 경우에도 더 만들 수 없습니다.

이것이 실행 중인 싱글톤 패턴입니다.

Lambdas는 인수에 대해 엄격하지만 Procs는 신경 쓰지 않습니다.

my_lambda =->(a, b) { a + b }my_proc =Proc.new { |a, b| a + b }my_lambda.call(2)# ArgumentError:잘못된 인수 수(1 for 2)my_proc.call(2)# TypeError:nil can't coerced into Fixnum

irb 또는 파일 없이 직접 코드 실행

ruby 명령에는 사용할 수 있는 여러 가지 흥미로운 옵션이 있습니다.

예를 들어, -e 실행할 코드 스니펫을 전달할 수 있는 플래그입니다.

ruby -e '5.times { puts "Fun with Ruby" }'

-h를 사용하여 더 많은 정보를 찾을 수 있습니다. 플래그.

하나의 명령으로 나만의 미니 irb

irb 공장? 음, 이것은 아주 간단한 버전입니다.

'REPL'이 무엇을 의미하는지 기억하십시오:Read-Eval-Print Loop.

루비 -n -e 'p 평가($_)'

프롬프트가 표시되지 않지만 Ruby 코드를 입력하세요.

"A" * 5"AAAA"

-n 플래그는 다음을 수행합니다.

-n '가져가는 동안(); ... 스크립트 주위의 end' 루프

그리고 $_ 전역 변수입니다. 다음을 포함합니다:

gets 또는 readline에 의한 문자열의 마지막 입력 라인.

객체 고정 해제(위험!)

개체를 고정 해제하는 Ruby 메서드는 없지만 Fiddle을 사용합니다. 이를 실현하기 위해 Ruby 내부에 접근할 수 있는 클래스입니다.

'fiddle'str ='water'.freezestr.frozen이 필요합니까? # truememory_address =str.object_id * 2Fiddle::Pointer.new(memory_address)[1] &=~8str.frozen? # 거짓

집에서 시도하지 마세요!

특별한 정체성을 가진 개체

Ruby 객체에는 object_id를 사용하여 액세스할 수 있는 식별자 또는 'id' 번호가 있습니다. 방법. 일부 개체에는 고정 ID가 있습니다:Fixnums, true, false 및 nil.

false.object_id # 0true.object_id # 2nil.object_id # 41.object_id # 32.object_id # 5

Fixnum ID는 다음 공식을 사용합니다:(숫자 * 2) + 1.

보너스:최대 Fixnum은 1073741823입니다. , 그 후에 Bignum 개체를 얻습니다.

irb 또는 pry에서 큰 출력을 피하십시오.

irb에서 작업하는 경우 그리고 ;를 추가할 수 있는 정말 큰 배열이나 문자열의 내용으로 화면을 채우는 것을 피하고 싶습니다. 코드 끝에.

:

'rest-client'RestClient.get('www.rubyguides.com') 필요

; 없이 다시 시도하세요. 차이점을 확인하려면 🙂

호출자 메서드를 사용하여 현재 호출 스택 가져오기

다음은 코드 예입니다.

def foo barenddef bar는 callerendfoo를 넣습니다.

출력 :

-:3:'foo'-:10:in '
'

현재 메서드 이름이 필요한 경우 __method__를 사용할 수 있습니다. 또는 __callee__ .

보너스! 모든 값을 부울로 변환

!!(1) # 참!!(nil) # 거짓

보너스! 키워드를 변수 이름으로 사용

def foo (if:nil) binding.local_variable_get(:if)endfoo(if:true)

요약

이 Ruby 트릭을 즐겼기를 바랍니다!

친구들과 공유하여 친구들도 즐길 수 있도록 하고 내 블로그를 구독하세요. 내 다음 게시물을 놓치지 않도록 아래 양식에. 🙂