PMPV

ruby koan 가이드 v.2 본문

Ruby on Rails/ruby koan

ruby koan 가이드 v.2

playinys 2018. 2. 6. 18:46
반응형

0.

ruby koan의 가이드가 불친절하다고 느끼는 분을 위해,

분명 코드카데미를 했는데 한 줄의 소스도 이해하기 어려운 분을 위해,

영어 가이드와 터미널이 낯선 분을 위해,


성결대학교 멋사의 루비코안 가이드 버전 투.

피드백 환영합니다.


1.

Koan은 Ruby를 배우기 위해 당신을 계몽의 길로 인도합니다. 

목표는 Ruby 언어, 구문, 구조 및 일반적인 기능과 라이브러리를 배우는 것입니다


http://rubykoans.com/


ruby koan 사용법과 구조


ruby koan의 구성을 보겠습니다.


프로젝트 구성


프로젝트 파일은 다음과 같은 구성으로 되어있습니다. 각 파일은 이슈별로 분류되어있고, 하나의 섹션으로 보시면 되겠습니다.


예를 들면 about_hashes.rb 파일은 루비 해쉬 형식에 대한 이슈를 담고 있습니다. 각 장마다 문제가 담겨있고, 우리는 이 문제들을 해결하면서 프로젝트를 완성시켜 나갈 수 있습니다. 처음은 about_object.rb로 시작합니다. 해당 섹션을 보기 전에, 터미널에 ruby path_to_enlightenment.rb를 요청해보겠습니다.



Please meditate on the following code:

  /Users/p/Desktop/ruby_koans/koans_file/about_objects.rb:13:in `test_objects_can_be_converted_to_strings'


learn the rules so you know how to break them properly

your path thus far [.X________________________________________________] 1/99


이 부분의 오류 메세지에 주목합니다. 
about_objects.rb 파일의 13번째 줄에서 오류가 발견되었고, 해당 함수의 이름은 `test_objects_can_be_converted_to_strings' 입니다.
그리고 가장 마지막에 99개의 문제 중에 하나가 해결 됐다는 메세지가 있습니다. 이제부터 하나하나씩 해결해봅시다.

가장 처음의 문제가 발견된 about_objects.rb 파일을 보겠습니다.



여기에는 7개의 메서드가 있고, 각 메서드는 하나의 이슈를 담당합니다.

첫 번째 메서드의 이름은 test_everything_is_an_object입니다. 우리가 코드카데미에서 본 것처럼, "루비의 모든 것은 객체" 라는 이슈에 대한 문제 같습니다. 첫 줄을 보겠습니다.

assert_equal true, 1.is_a?(Object)

콤마(,)를 기준으로 좌항과 우항으로 나뉩니다.

여기서 Ruby Koans Tutorial.md 문서에 나와있는 설명을 보겠습니다.


1.is_a?(Object)1Object인지 물어보고 ture 혹은 false를 리턴해줍니다


1이 object라면 true를 리턴해줄 것이고, 아니라면 false를 리턴해주겠죠?

루비에서 모든 것은 객체이기 때문에 여기서는 true가 리턴 될 것입니다.

이 메서드에서 assert_equal 뒤엔 모두 true가 들어가있습니다. 모든 것은 객체라는 사실을 증명해주는 섹션이란 소리입니다.


여기서 우리는 irb를 이용해 테스트 해볼 수 있습니다. 컴퓨터에 루비가 설치되어 있다면 커널에서 irb로 루비 코드를 입력할 수 있는 셀을 호출할 수 있습니다.



  pui-MacBook-Air:~ p$ irb

  2.3.3 :001 > 1.is_a?(Object)

   => true 

  


첫 번째 메서드가 해결되었다면, 다음으로 넘어가겠습니다.


두 번째 메서드의 이름은 test_objects_can_be_converted_to_strings 입니다. 이번엔 객체가 문자열로 변환 되는지에 대한 이슈입니다.

assert_equal ___, 123.to_s
assert_equal
___, nil.to_s

이번엔 assert_equal 뒤에가 ___로 공백 처리가 되어있습니다.

우항을 살펴보겠습니다. 컨버팅이 된다면, 123을 문자열로 변환했을 때 "123"이 리턴되겠죠?

irb로 다시 한 번 확인해보겠습니다.



  2.3.3 :001 > 1.is_a?(Object)

   => true 

  2.3.3 :002 > 123.to_s

   => "123" 



예상대로 "123"이 출력되는 것을 볼 수 있습니다.

그렇다면 위에서 빈 칸을 우리의 예상대로 채워보겠습니다.

assert_equal '123', 123.to_s
assert_equal '', nil.to_s

이렇게 저장을 하고, 터미널에서 다시 한 번 path_to_enlightenment.rb을 요청해보겠습니다.


아까와 달라진게 보이시나요? 13번째 줄을 지적하던 에러 메세지가 18번째 줄, 다음 메서드의 첫 문제로 바뀌고 99개의 문제 중 2 문제를 해결했다는 메세지로 바뀌었습니다.


이렇게 우리는 irb로 테스트를 해가면서 각 메서드의 공백을 채워나갈 수 있습니다.


99개의 문제를 모두 해결해보면서 루비에 대한 이해를 높여 나갑시다

화이팅

룰루

2.

assert_equal, raise, match 의 활용법


각 함수는 neo.rb에 정의되어있습니다.


module Assertions
FailedAssertionError = Class.new(StandardError)

def flunk(msg)
raise FailedAssertionError, msg
end

def assert(condition, msg=nil)
msg ||= "Failed assertion."
flunk(msg) unless condition
true
end

def assert_equal(expected, actual, msg=nil)
msg ||= "Expected #{expected.inspect} to equal #{actual.inspect}"
assert(expected == actual, msg)
end

def assert_not_equal(expected, actual, msg=nil)
msg ||= "Expected #{expected.inspect} to not equal #{actual.inspect}"
assert(expected != actual, msg)
end

def assert_nil(actual, msg=nil)
msg ||= "Expected #{actual.inspect} to be nil"
assert(nil == actual, msg)
end

def assert_not_nil(actual, msg=nil)
msg ||= "Expected #{actual.inspect} to not be nil"
assert(nil != actual, msg)
end

def assert_match(pattern, actual, msg=nil)
msg ||= "Expected #{actual.inspect} to match #{pattern.inspect}"
assert pattern =~ actual, msg
end

def assert_raise(exception)
begin
yield
rescue Exception => ex
expected = ex.is_a?(exception)
assert(expected, "Exception #{exception.inspect} expected, but #{ex.inspect} was raised")
return ex
end
flunk "Exception #{exception.inspect} expected, but nothing raised"
end

def assert_nothing_raised
begin
yield
rescue Exception => ex
flunk "Expected nothing to be raised, but exception #{exception.inspect} was raised"
end
end
end

하나하나 활용법을 보겠습니다.

def assert_equal(expected, actual, msg=nil)
msg ||= "Expected #{expected.inspect} to equal #{actual.inspect}"
assert(expected == actual, msg)
end

가장 자주 등장하는 assert_equal입니다.

위에서 설명한대로, 콤마를 기준으로 우항의 예상 반환값을 좌항의 빈칸에 넣으면 됩니다.

def assert_raise(exception)
begin
yield
rescue Exception => ex
expected = ex.is_a?(exception)
assert(expected, "Exception #{exception.inspect} expected, but #{ex.inspect} was raised")
return ex
end
flunk "Exception #{exception.inspect} expected, but nothing raised"
end

그 다음으로 나오는 assert_raise 입니다. about_hashes.rb의 26번째 라인에 처음 등장합니다.

쉽게 생각하자면, assert_raise는 다음에 블록이 등장합니다. 이 블록의 소스가 불러올 에러를 예측하는 함수입니다.

assert_raise (___) do ~ 이런 식으로 되어있는데, 블록이 불러올 오류의 이름을 빈칸에 채워 넣으면 됩니다.


자세한 내용은 정리되어있는 포스팅을 확인하세요.

def assert_match(pattern, actual, msg=nil)
msg ||= "Expected #{actual.inspect} to match #{pattern.inspect}"
assert pattern =~ actual, msg
end

about_methods.rb의 39번째 라인에 처음 등장하는 assert_match 입니다.

raise가 오류의 이름을 예측하는 함수라면, match는 오류의 패턴, 혹은 메세지를 예상하는 문제입니다.

빈칸에는 오류의 메세지를 적으면 됩니다. 바로 위에 링크된 포스팅에 설명이 같이 있는데, 아무래도 따로 작성해야 할 것 같습니다.


내용이 추가된다면 다시 포스팅을 하겠습니다.

오늘은 여기까지!


반응형
Comments