2014-04-18 3 views
1

방금 ​​신발을 사용하기 시작했고 릴리 비트를 알고 있지만 객체와 생성자에 대해 이해할 수없는 무언가가 있습니다.루비 생성 객체 구문

require 'shoes' 

class ListCell < Shoes::Widget 
     def initialize 
      stack :margin_left => 30, :top => 30 do 

      line 50, 100, 200, 200 

      end 
     end 
end 

Shoes.app :width => 500, :height => 400 do 

    stack do 
     @line = list_cell 
    end 

end 

이유 : 여기

Shoes.app do 

    @shape = star(points: 5) 

    motion do |left, top| 
    @shape.move left, top 
    end 

end 

는 다른 예입니다

@obj = SomeClass.new(:someParameter => 3) 

지금 신발이 나 객체에게이 방법을 만들려면 :

나는 개체를이 방법을 만들 수 배웠습니다 새로운 누락이 있습니까? 신발이 첫 번째 예제에서 매개 변수를 전달하기 위해 콜론과 함께 구문을 사용하는 이유는 무엇입니까?

두 번째 예제에서는 ListCell 개체를 만들지 만 new가없는 list_cell 구문을 사용합니다. 이것은 왜 이와 같이 작동합니까?

이것은 매우 기본적인 질문 일 뿐이지 만 저는 루비를 배우려고 노력하고 있습니다. VB.Net/Java 배경을 가지고 있으며 몇 가지 일들은 저에게 아주 이상하고 평범하지 않습니다. 구문이 나를 혼란스럽게합니다.

+0

'신발'의 소스 코드를 읽지 않는 이유는 무엇입니까? Ruby DSL이라고 생각합니다. –

+0

이 신발 전용 구문은 무엇입니까? 뭐야? –

답변

2

클래스 메소드

Shoes.app do는 인스턴스를 생성하지 않는,이 a class method를 호출한다.

이렇게하면 클래스를 인스턴스화 할 필요없이 클래스에서 직접 메서드를 호출 할 수 있습니다.

class Foo 
    def self.hello 
    puts "hello" 
    end 
end 

Foo.hello # outputs "hello" 

블록 매개 변수는

블록 양식을 혼동 할 수 있지만,이 방법에 로직의 덩어리를 전달할 수 있습니다 an other ruby idiom입니다 :

def yell(message, &block) 
    block.call(message.upcase) 
end 

yell('hello') do |message| 
    puts message 
end 
# outputs "HELLO" 

DSL 마지막으로

하는있다 특수한 형식의 블록 매개 변수로 구성이 잘되어있어 다른 컨텍스트에서 평가되는 블록입니다.

이전 예와 같이 블록을 호출하면 블록 내부의 코드가 호출 된 클래스의 private 메소드 또는 변수에 액세스 할 수 없습니다. 블록이 선언 된 범위에있는 것만 액세스 할 수 있습니다.

당신은 #instance_eval를 사용하는 것을 변경할 수 있습니다

class Foo 
    def config(&block) 
    instance_eval &block 
    end 

    def write! 
    # perform some writing 
    end 
end 

foo = Foo.new 
foo.config do 
    write! # this will work 
end 

그래서, 기본적으로, 당신의 신발이 세 개념 :

아마 그렇게하지만 이것은 (클래스를 인스턴스화되지 않는 조합을하고있다 후드 뒤에) 그리고 특별히 필요하지는 않습니다. 예전처럼 초기화를 사용하십시오.

4

이것은 단지 DSL입니다. star과 같은 메소드는 .new을 호출합니다.

콜론 구문은 루비 1.9.3에 도입 대안 해시 구문은 다음과 같습니다

{ :a => :b } 
{ a: :b } 

이 두 줄은 같은 일을한다.