잊지 않겠습니다.

'RUBY'에 해당되는 글 14건

  1. 2009.01.07 Chapter 06. Method
  2. 2009.01.07 Chapter 05. Standard data type
  3. 2009.01.07 Chapter 04. Container, Block, Iteritor
  4. 2009.01.07 Chapter 03. Class, Instance, Variable
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
,

Container

Array의 형태는 '[]'로 만들어준다.

a = [3.14, "pie", 99]

음수의 index의 경우에는 뒤에서부터 세는것이 가능하다.

shift,  pop이 모두 가능하다. 

Hash의 경우에는 '{}'로 만들어준다.

h = {'cat'=>'cats name', 'dog'=>'dogs name', 'count'=>10}

Block과 Iteritor

yield의 구현 : code block을 실행시켜주는 method.

sorce code에서는 block은 method 호출 바로 뒤에서만 나타나게 된다.

block안의 code는 나타나자마자 실행되지 않는다. 대신 Ruby가 block이 나타날 때의 상태를 기억하고 method로 들어가게 된다.

yield가 실행될 때마다, Block의 코드가 실행된다. : yield의 경우에는 Block의 code를 호출하고, 그 변수를 return 시켜주게 된다. 

def fix_up_to(max)
    i1, i2 = 1, 1
    while i1 <= max
       yield i1
       i1, i2 = i2, i1 + i2
    end
end

fix_up_to(1000) { |f| print f, " " }

: 실행순서 i1이 리턴된 후에 f로 들어가게 되어서, print f가 실행된 후에 다시 while 문으로 된다.

Block code의 경우에는 그 안에 있는 변수는 내부에서만 효용있는 변수가 된다.

 

 

Posted by Y2K
,
Class
  • 생성자 : initialize() 함수가 생성자로 만들어진다.
  • 모든  Class들은 열려져있는 상태를 유지하게 된다. 이미 정의된 CLass에서라도 언제든 원하는 메서드를 추가하는 것이 가능하다.
    • 같은 method를 다시 선언해서 치환하는 것이 가능하다.
  • super
    • 부모 Class에서의 선언되어있는 모든 것들을 의미한다.
    • Kasaoke < Song 의 경우에,  to_s의 부모 선언부를 알아보기 위해서는 다음과 같이 사용하면 된다.
    • 각 객체의 super class 를 순차적으로 찾아가면서 찾게 된다.
 class KaraokeSong < Song
    def to_s
        super + " [#@lyrics]"
    end
 end

Instance와 Property

C#에서의  property와  같은 접근법을 제공한다.(C# 3.0에서는 오히려 Ruby와 동일한 Class의 생성법들을 제공하고 있다.)

class Song
    attr_reader :name, :artisit, :duration
    attr_writer :name, :artist, :duration
end

위와 같은 코드에서는 자동적으로 @name, @artist, @duration과  Song.name, Song.artist, Song.duration의  읽고 쓰기가 가능한 Property가 생성이 된다.

Method와 속성과의 차이

: C#에서도 같은 이야기가 나온적이 있었고, 무언지 좋은지 나쁜지에 대한 토론이 자주 있었던것 같다. 그렇지만, 이에 대해서 확실한 것은 code의 가독성이라는 것에 대한 차이는 상당히 크다고 생각이 된다. 여러가지 코드를 볼때 언제나 값을 넣을 때, set, get의 Method만을 호출하는 것과, 자신의 Class의 값에 대해서는 Property를 이용해서 값을 넣고, 무언가 다른 class나 다른 resource에 값을 설정하고 저장할 때, 그에 대한 내용으로 set, get을 이용하는 것이 좀더 나은 방법으로 생각된다.

Class Variable & Class Method

:  생성된 모든 Class에서는 모두 instance를 가지게 된다.  Ruby에서 제공되는 Class Variable과 Class Method는 일반적으로 제공되는 Static Method와 Static Variable과 동일하게 생각하면 된다.


Class Variable

: '@@'로 정의된 변수를 의미한다. 모든 Class에서 공용으로 사용하게 된다.

Class Method

: 선언부로 instance메서드와 구분된다.

class Example
    def instance_method
    end
    def Example.class_method
    end
end
Singleton과 다른 생성자들

다음과 같은 코드를 이용해서 생성자로 생성을 못하고, 자신의 다른 생성자를 이용해서 instance를 생성시키는 것이 가능하다.

class MyLogger
    private_class_method :new
    @@logger = nil
    def MyLogger.create
        @@logger = new unless @@logger
        @@logger
    end
end
Class의 접근 제어 방법

Ruby에서는 모든 함수의 접근 제어 방법이 기본적으로 "public"으로 선언된다.

함수의 앞부분에 public, protected, private로 지정이 가능하다.

Class의 모든 단계에서 선언도 가능하다.

class MyClass
    public : method1, method4
    protected : method2
    private : method3

Posted by Y2K
,