2013-04-12 1 views
4

대부분의 경우 개체의 메서드를 호출 할 때 점 표기가 필요합니다. 점을 사용하여 메서드 이름과 함께 개체를 연결하는 데 사용한다고 가정하지만 산술 연산에서는 숫자 개체와 해당 연산 메서드 사이에 공백이 있습니다. 예를 들어, 루비의 수치 객체는 도트 표기법을 어떻게 제외합니까?

7.-(5) 

도트 표기법을 사용하고, 또한 오퍼레이터 및 피연산자 사이에서 선택적 공백

7 - 5 

같이 쓸 수있다. 메소드 호출을 어떻게 수행 할 수 있습니까?

+0

마찬가지로 : 여기

모든 구문 설탕의 목록이 호출 표기법입니다 파이썬'2 + 2'에서의 비교는'(2) .__ add __ (2)'(루비의 의미를 모르지만)와 동일합니다. –

+0

더 이상의 혼란이 있습니까? 저희에게 알려주십시오. 나는 대답에 따라 적절히 업데이트 할 것이다. 나는 당신이 지금 사실을 간파하기를 바랍니다. –

+0

@RubyLovely, RubyMonk에 대한 정보 주셔서 감사합니다. "루비는 일반적으로 사용되는 연산자에 대한 구문 규칙에서 예외를 만들었으므로 객체에서 마침표를 사용하지 않아도됩니다." 내 혼란은이 규칙의 시행에 기인 한 것 같습니다. 숫자 객체가 연산자 메소드와 앞의 숫자 객체가 표현식에서 분리 된 경우 어떻게 숫자 객체가 메소드 호출을 수행 할 수 있습니까? – SirLemuel

답변

5

Syntactic Sugar for Special Methods 루비의 모든 구문 설탕을 알아야 할 좋은 자료입니다.

아래의 내용은 모두 Ruby에서 동일합니다. 당신이 2 + 3을 쓸 때 루비에있는 모든 객체이므로

2 + 3 #=> 5 
2.+(3) #=> 5 
2.+ 3 #=> 5 

때문에, 그것은 2.+(3) 또는 2.+ 3

로 내부적으로 일어나고있다. 여기 2Fixnum 개체입니다. .을 사용하면 객체 2+ 메서드를 호출합니다.

2.class #=> Fixnum 
2.instance_of? Fixnum #=> true 
2.respond_to? :+ #=> true 

또 다른 예

아래 다음과

"a" + "b" #=> "ab" 
"a".+"b" #=> "ab" 
"a".respond_to? :+ #=> true 

respond_totrue을 반환 - String 클래스는 연결 방법 +을 가지고 있기 때문입니다. 문자열 클래스 'a'의 개체가 b을 인수로 전달하여 + 메서드를 호출 할 수 있습니다.

+0

좋은 답변입니다. 단항 마이너스의 특별한 경우도 언급 할 수 있습니다. –

+0

당신이 준 링크는 구문법적인 설탕 중 일부만주고 있습니다. 모두를 나열하지는 않습니다 (예 : –

+0

@ Marc-AndréLafortune 네, 맞습니다. "-", "!", [[] =', ... :) 그러나 나는 그에게 개념적인 아이디어를 주려고 노력했다. 하지만 응답자 중 한 명이 이미 저를 대신하여 일을 처리했습니다. :) 그래서 나는하지 않았다. –

0

루비는 파이썬보다 직각이지만 완벽하다는 의미는 아닙니다. 그냥

for x in (1..3) do 
    puts x 
end 

그것을 가지고 있기 때문에, 당신을 위해 좋은 의미하지 않는다 : 그래서, 그것은 또한 그 이상을 가지고, 예를 들어, 또한 for 키워드 (즉, 각각의 호출에 대한 번역)가 사용. for과 같은 메서드를 사용하는 것이 좋습니다. each을 사용하는 것이 더 좋으므로 이미 읽었을 것입니다.

.과 함께 + 메서드를 호출하거나 메시지에 +을 보내는 것은 언어를 실제로 직각으로 유지하는 것만 큼 가치가없는 것입니다.

Ruby에 대해 gramatic을 볼 수 있으며,이 부분에 관심이 있다면 다른 비 직교 측면을 찾는 데 도움이 될 수 있습니다.

+0

'for'는 메소드가 아니며 키워드입니다. 그리고 그것은'each'에 대한 호출로 변환됩니다. –

+0

감사합니다. – fotanus

2

따라서 메소드 호출을 수행 할 수있는 숫자 객체는 무엇입니까?

숫자 개체는 알아낼 필요가 없으며 루비가 내부적으로 처리합니다.

class Foo 
    def +(arg) 
    puts "adding #{arg}" 
    end 
end 

Foo.new + "bar" 
# => adding bar 
+0

이것은 정확하게 내가 이해하려고 노력한 것입니다. 불행히도, 나는 그것을 upvote조차 수 없다. 감사 – SirLemuel

0

어떻게 메서드 호출을 수행 할 수 있습니다 : 그리고 그것은 단지 숫자, 어떤 개체에 대한 작동?

글쎄, 이것을 syntactic sugar이라고합니다. 그것은 정말로 특별한 것이 아닙니다. 단지 코드를 좀 더 이해할 수 있고 읽을 수있게하기 위해 일반적인 루비 메소드 호출 규칙에 예외이 예외입니다.

7.-(5)7 - 5보다 빠릅니다. 나는 그렇게 생각하지 않는다. 이것이 예외이 존재하는 이유입니다.

루비 인터프리터 어떤 x - y를 판독뿐만 x[y]x.[]=(y, z)로 번역 x.[](y) 또는 x[y] = z로 변환 될 때 x.-y로 변환하기 때문에 가능하다.

이미지가 2 부에서이 개념을 다루고 The Well-Grounded Rubyist라는 매우 좋은 책에서 가져 enter image description here

, 7 장

관련 문제