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

루비 마법을 없애고 보석을 이해하는 방법

Rails 앱을 빌드할 때 보석 더미를 사용하게 됩니다. 그들 중 일부는 완전히 마법처럼 보입니다! 그런데 그 마법이 어떻게 일어나는 걸까요?

대부분의 보석에서는 당신이 할 수 없는 일을 그들이 하고 있지 않습니다. 루비 코드일 뿐입니다. 때로는 복잡합니다. 루비 코드. 그러나 해당 코드를 탐색하면 그 마법이 어디서 오는지 이해하기 시작할 것입니다.

소스 코드 찾기

gem이 어떻게 작동하는지 이해하려면 코드를 찾아야 합니다.

더 알고 싶은 메소드가 있다면 method에서 소스를 쉽게 찾을 수 있습니다. 및 source_location . 이에 대해 조금 전에 썼습니다. . 다음은 예입니다.

irb(main):001:0> ActiveRecord::Base.method(:find).source_location
=> ["/usr/local/lib/ruby/gems/2.1.0/gems/
  activerecord-4.2.0.beta4/lib/active_record/core.rb", 127]

하지만 한 가지 이상의 방법에 관심이 있다면 어떻게 하시겠습니까?

Rails 앱의 디렉토리에 콘솔이 열려 있으면 gem의 코드로 바로 이동할 수 있습니다.

~/Source/gem_example[master] jweiss$ bundle open rack

Gemfile에 있는 경우 , bundle open rack 전체 rack을 엽니다. 편집기에서 gem. 안에 있는 모든 파일을 편안하게 탐색할 수 있습니다.

어디서 시작합니까?

이제 gem의 코드가 어디에 있는지 알았으니 어떻게 이해하기 시작할까요?

activerecord 방법을 배우려고 하면 lib/active_record.rb를 읽어서 작동합니다. , 당신은 아무데도 가지 않을 것입니다. autoload s 및 require s.

이후 보석을 이해하는 것이 가장 쉽습니다. 당신의 앱은 그것을 조금 사용합니다. 보석이 당신을 위해 하는 일의 종류에 대해 더 많이 알게 되면. 그렇게 하면 어떤 흥미로운 클래스와 메서드로 시작해야 하는지 이미 알 수 있습니다.

몇 가지 흥미로운 메서드의 이름을 알고 나면 source_location을 사용할 수 있습니다. , 프로젝트에서 찾기 편집기에서 또는 명령줄에서 ag를 사용하여 해당 메서드가 정의된 위치를 확인합니다. 그때부터 재미가 시작됩니다.

gem의 코드는 당신의 컴퓨터에 있습니다. 맞죠? 즉, 원하는 대로 변경할 수 있습니다! 당신이 그것을 깨뜨릴 수도 있으며, 다른 사람은 그것을 알 필요가 없습니다.

gem이 어떻게 작동하는지 이해하려고 할 때 저는 코드만 읽지 않습니다. puts을 추가합니다. 명령문을 gem에 넣을 때 예외를 던지고 내 앱이 어떻게 특정 라인에 도달했는지 알아내고 작성자가 왜 그런 식으로 작성했는지 이해하기 위해 코드를 엉망으로 만들었습니다.

트릭이 어떻게 수행되는지 알고 나면 훨씬 덜 마법적입니다. 또한 추측할 필요가 없습니다. 그 코드가 이상한 상황에서 어떻게 작동하는지 직접 볼 수 있기 때문입니다.

정리하기

젬 코드를 엉망으로 만든 후에는 앱의 상태가 상당히 나빠질 수 있습니다. 더 이상 실행되지 않을 수도 있습니다! 그렇게 되더라도 모든 puts을 스팸으로 보낼 것입니다. 콘솔에 추가한 명령문

그러나 RubyGems에는 상황을 정상으로 되돌릴 수 있는 빠른 방법이 있습니다.

~ jweiss$ gem pristine activerecord -v 4.2.0
Restoring gems to pristine condition...
Restored activerecord-4.2.0

또는 어떤 보석을 사용했는지 기억나지 않고 인내심이 강한 경우:

~ jweiss$ gem pristine --all

그 후에는 모든 보석이 설치했을 때의 상태로 돌아갑니다.

무엇을 탐색할 예정입니까?

젬 내부의 코드를 찾고 읽고 탐색하면 의존하는 코드를 더 깊은 수준에서 이해할 수 있습니다. 더 이상 가정과 추측에 의존할 필요가 없습니다.

이 게시물은 원래 내 목록에만 전송되었습니다. 매주 금요일 받은편지함에 유사한 게시물을 더 많이 받으려면 여기에서 가입하세요!