멋진 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 Fixnumirb 또는 파일 없이 직접 코드 실행
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 # 5Fixnum 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 트릭을 즐겼기를 바랍니다!
친구들과 공유하여 친구들도 즐길 수 있도록 하고 내 블로그를 구독하세요. 내 다음 게시물을 놓치지 않도록 아래 양식에. 🙂