2014-01-29 4 views
3

나는 루비를 배우고 그것의 생활이 무엇을 알아낼 수 없기 :같은 이름의 기능은 무엇을합니까?

def topic_list 
    topics.map(&:name).join(",") 
end 

def topic_list=(names) 
    if names.present? 
    topics = names.split(",") 
    self.topics = topics.map do |n| 
     unless topic = Topic.find_by(slug: n) 
     topic = Topic.create!(name: n) 
     end 
     topic 
    end 
    end 
end 

왜 두 개의 함수가 같은 이름을 가질 것인가? 첫 번째 함수가 두 번째 함수를 호출합니까?

+2

자세히 보아라. 그들은 같은 이름을 가지고 있지 않다. 하나는'topic_list'로 명명되고, 다른 하나는'topic_list ='로 명명됩니다. –

답변

5

topic_list게터이고 topic_list=세터 방법이다. 그들은 같은 방법이 아닙니다.

이 질문은 Trying to learn/understand Ruby setter and getter methods이 개념의 기본 식품으로 도움이 될 것입니다. 그래서 그것을 읽으십시오.

있어서 topic_list=

라인 self.topics = topics.map...topics 및 세터 topics=라고 한 게터가 냄새 topic_list 방법에서 topics.map(&:name).join(",") 라인. 나는 당신의 코드를보고 이것에 대해 확신한다.

+0

@Hopstream 아니, 그렇게하지 않습니다. OP는 주제를 이해하기 위해 코드의 일부를 사용했습니다. –

+0

인수가없는 경우 getter는 어떻게': name'을 얻습니까? this :'topics.map (& : name) .join (",")' – user3188544

+1

@ user3188544'topic_list ='메소드에서'self.topics ='가 사용되었다고 확신합니다. 그래서 분명히 인스턴스 변수'@ topics'가 존재하며 getter'topics'와 setter'topics ='가 존재해야합니다. –

1

Arup Rakshit's answer 좀 더 명확히하기 위해 :

루비는 방법의 일부 "이상한"문자를 가지고 있습니다, 당신은 일반적으로 다른 언어로 볼 것이다. 가장 주목할만한 것은 ?, !=입니다.

그래서, 당신은 방법을 정의 할 수 있습니다 : PHP, 말,에서 오는 사람을

def answered?() 
    not @answer.nil? 
end 

def answer!() 
    @answer = Answer.new 
end 

def answer() 
    @answer 
end 

def answer=(answer) 
    @answer = answer 
end 

, 이것은 이상한 보인다. 그러나 실제로 그들은 모두 다른 방법입니다! 내 요점을 명확히하기 위해 모든 부분을 괄호로 묶었지만 Ruby에서는 메서드를 사용하지 않으므로 메서드가 인수를 취하지 않을 때 사람들은 일반적으로 메서드를 종료합니다.

def answer() 
end 
def answer 
end 

동일합니다.

마지막 두 개는 과 answer=()이며 getter 및 setter라고도합니다. 첫 번째는 흔히 has_question? 또는 valid?과 같은 바이너리를 테스트하는 데 사용됩니다. 두번째는 을 수정하는 some_array.merge!(other_array)과 같이 bang 메서드, answer!이라고 자주 언급되며, 자주 수정되는 메서드에서 자주 사용됩니다.

관련 문제