잊지 않겠습니다.

Command Expand

(`)또는 %x로 시작하는 구분자 형식을 이용하면 사용중인 기반 운영체제에 의해 command로 실행된다.

 

조건적 실행

논리 표현식

Ruby에서의 true : nil이 아니고 false가 아니면 모두가 true로 된다. 따라서 숫자 0나 길이가 0인 문자열 역시 true로 해석된다.

defined?, And(&&), Or(||), Not(!)
defined?

정의되지 않을때 nil이 반환되며, 그렇지 않은 경우 매개 변수에 대한 설명을 반환한다.

eql?

수신자와 매개변수가 서로 같은 타잎이며, 같은 값을 갖는 경우 참이 된다.

1==1.0 : true
1.eql?(1.0) : false

equal?

수신자와 매개변수가 같은 객체 ID를 가질 경우 true로 된다.

 

논리 표현식

if, elsif, unless

마치 python과 비슷하게도 사용 가능하고, 문법에서의 자유도가 매우 높은 것을 알 수 있다.
구문 변경자로도 사용 가능하며, 이는 조건문을 일반 구문에 끝에 붙여서 사용가능할 수 있게 해준다.

if song.artist == "Gillespie" : handle = "Dizzy"
elsif song.artist == "Parker" then handle = "Bird"
else handle = "unknown"
end
mon, day, year = $1, $2, $3 if date ~= /(\d\d)-(\d\d)-(\d\d)/
Case

if 구문의 연결 형태와 유사

case..when구문으로의 사용

문자열이나 숫자보다는 Expression에서의 true가 적용될 때 해당

while, until

while 구문과 until구문은 반대로 동작하는 것으로 해당

file = File.Open("ordinal")
while line = file.gets
   puts(line) if line = ~/third/ .. ~ /fifth/
end

 

반복자

: Ruby에서는 for loop구문이 없다. for loop구문보다 더욱더 강력하고 편한 방법으로 수행이 가능하다.

0.upto(9) { |x| print x, " " }
0.step(12, 3) { |x| print x, " " }

: Ruby에서의 for loop는 each method에 응답하는 객체와 같이 사용된다.

 

songlist.each do |song|
    song.play
end

변수의 유효 범위, 반복문, 블록

  1. while, until, for에서는 새로운 변수 범위가 생성되지 않는다.
  2. loop, each에서는 새로운 변수 범위가 생성된다.
  3. {} 형식 변수의 경우에도 역시 새로운 변수 범위로서 생성된다. 
Posted by Y2K
,
Ruby에서의 Method의 기본 규칙
  1. def keyword이용
  2. 반드시 소문자로 시작
  3. 무언가를 묻는 method는 대부분 ´?´로 종결
  4. 객체의 값을 바꾸거나 위험한 method는 모두 !로 종결
  5. 대입문에 사용 가능한 method는 =로 종결된다. 
  6. return 값은 마지막으로 실행된 표현식의 결과값이거나 명시적으로 쓰인 return값의 결과가 얻어진다. 
가변 인자 리스트

: python과 비슷하게 가변 인자가 들어가는 경우에는 *로 가변 형식 인수를 구분할 수 있다.

def varargs(arg1, *rest)

"Got #{arg1} and #{rest.join(' ,')}"

end 

Method와 Block

Method내부에서는  yield를 이용해서 block의 코드를 호출 할 수 있다.
Method 선언부에서 형식인수에 &가 붙은 경우에는 형식 인수에  block이  Proc  함수로 대응되어 들어가게 된다.

 class TaxCalculator
    def initialize(name, &block)
        @name, @block = name, block
    end
    def get_tax(amount)
        "#{amount}원에 대한 #{@name} = #{ @block.call(amount) }"
    end
end
 
Method의 호출
print "(t)imes or (p)lus : "
times = gets
print "number"
number = Integer(gets)

if times =~ /^t/
    calc = lamda { |n| * number }
else
    calc = lamda { |n| + number }
end
puts( (1..10).collect(&calc).join(", ") )


Python에서와 동일하게 Hash Table을 이용한 함수의 선언도 역시 사용가능하다.

list.create_search("short jazz songs", 
                 {
                   'genre' => "jazz",
                   'duration_less_than' => 270
                 }
Posted by Y2K
,

Number

Ruby에서는 모든 숫자도  Class로 구성이 된다. 따라서  숫자 뒤에 '.'을 입력하게 되면 method를 호출하는 것이 가능하다.

irb(main):017:0> num.times { print "this number is printed\n" }

Standard Regular expression

문자열 표현에 대한 식을 저장할 수 있으며 문자열을 치환역시 가능하다.

패턴에서 .,|,(,),[,],+,\,/,^,$,*,? 를 제외한 모든 문자은 자신에 매치가 된다. 이 문자를 지정하기 위해서는 \를 이용해서 문자를 적어주면 된다.

  • ^ : 각 줄에서 가장 처음을 나타낸다.
  • $ : 각 줄에서 가장 나중을 나타낸다.
  • \A : 지정된 문자열의 첫부분을 나타낸다
  • \Z : 지정된 문자열의 맨 마지막부분을 나타낸다.
  • \B : 문자열이 아닌 것의 경계를 나타낸다.
  • \b : 문자열의 경계를 나타낸다.
  • \s : 공백을 나타낸다.
  • \w : 문자열을 나타낸다.
  • [] : 문자열의 집합을 나타낸다. 안에서 c1-c2와 같은 sequence를 사용하는 경우에는 c1에서부터 c2까지의 모든 문자를 나타낸다. ^를 사용하는 경우에는 역으로 지정이 된다. 
반복
  • r* : r이 없거나 1개 이상 나타나는 문자열에 매치
  • r+ : r이 하나 이상 나타나는 문자열과 매치
  • r? : r이 한번 또는 나타나지 않는 문자열과 매치
  • r{m,n} : m이상 n이하 나타나는 문자열과 매치
  • r{m, } : m이상 나타나는 문자열과 매치
그룹 : ()를 이용해서 그룹으로 묶어주는 것이 가능하다.
show_regexp("this is \nthe time", /^the/) -> this is\n<<the>> time
show_regexp("this is \nthe time", /is$/) -> this <<is>>\n the time
show_regexp("this is \nthe time", /\Athis/) -> <<this>> is \n the time
show_regexp("this is \nthe time", /\Athe/) -> no match
show_regexp("Price $12.", /[aeiou]/) -> Pr<<i>>ce $12
show_regexp("Price $12.", /[\s]/) -> Price<< >>$12
show_regexp("Price $12.",/:digit:/) -> Price $<<1>>2
show_regexp("see [Degine pattterns-page 123]", /[^a-z]/) -> see<< >> [Degine pattterns-page 123] 
: 패턴은 언제나 맨처음에 나오는 것에 인식이 된다. 여기에서는 소문자 a에서부터 z까지를 제외한 모든 문자를 
검색하기 때문에 /s가 먼저 검색된 상태이다.

Ruby에서는 검색된 문자열을 $1, $2와 같은 특별한 변수에 저장하고 결과를 사용하는 것 역시 가능하다.

 

문자열의 치환

  • string#sub method : 문자열 부분을 한번만 변경 시킨다.
  • string#gsub method : 문자열 부분을 모두다 변경시킨다. 
ex:모든 단어의 첫글자를 대문자로 변경시켜주는 Method
패턴은 \b\w
def mixed_case(name)
    name.gsub(/\b\w/) { |first| first.upcase }
end

 

Posted by Y2K
,