게임과 같은 텍스트 로그가 있습니다. 예를 들어 두 가지 유형의 항목이 있습니다. 채팅 및 이벤트. 대부분의 경우 매우 유사하므로 LogEntry 클래스를 정의했습니다.자기 = 루비의 자손?
class LogEntry < Array
def initialize(str)
super str.split
end
def parse
LogEntry.parse self
end
def LogEntry.parse(entry)
# Processes the elements that are in any Entry
# Figure out whether it's a Chat entry or an Event entry
# Returns an object of type LogChat or LogEvent
end
end
LogChat 및 LogEvent는 모두 LogEntry를 확장하고 해당 도메인과 관련된 추가 처리를 수행합니다. 모든 것이 예상대로 작동합니다.
chat = LogEntry.new("some chat")
event = LogEntry.new("some event")
chat.parse.class # => LogChat
event.parse.class # => LogEvent
질문 : 클래스 메소드는 본질적으로 LogEntry.parse 해당 클래스의 구문 분석 항목을 반환합니다. 이 문맥에서, 파싱 된 엔트리는 중요한 비트이다. 하지만 인스턴스 메소드 'parse'의 이름을 'what_type_should_i_be?'로 바꿀 수 있습니다. 객체가 그 정보에 따라 행동하기를 원합니다. 'self.become LogEntry.parse (self)'
바로 지금 엔트리를 파싱하려면이 작업을 수행해야합니다.
entry = entry.parse
나는이 결과를 얻기 위해 더 밀어주고 싶다.
entry.parse
나는 분명했습니다.
class LogEntry
def parse
self = LogEntry.parse(self)
end
end
그러나 오류 Can't change the value of self
가 표시됩니다. 아무도 내가 이것을 달성하는 방법에 대해 알아야합니까?
편집 : 많은 답변이 많은 항목에 걸쳐 반복에 초점을 맞추기 때문에 예제를 변경했습니다. Chuck의 대답은이 상황이 문제가 아니라는 것을 우아하게 보여줍니다.
이렇게하면 누군가의 관심을 불러 일으키고, 나는 Evil Ruby을 우연히 만났고, 그것은`self.class '로 간섭했다. 그것에 대해 좋은 Orielly 기사는 Ruby code that will swallow your soul!라고합니다. 나는 그것이 어떤 대답을 제시하는지 알아보기 위해 조사 중입니다. (편집 : evil.rb는 잘 명명 된 것입니다. 저수준이 안정적/장기적 분포에 적합하지 않은 것처럼 보입니다.)
+1 재미있는 사고 방식을 시작합니다. 나는 이것을'parse' 메쏘드 안에서 구현할 수 있는지를 알 것입니다. 나는 그 물건을 보면서 "실제로, 나는 그런 종류의 물건에 관한 것"이라고 말하고 싶다. – deau
내가 너 자신에게 이상한 일을하고 있다고 생각하니? 이론적으로 말해서, 이런 식으로 자신을 통제하는 물체를 갖는 것은 위험할까요? – deau
글쎄, 기술적으로 "self"를 설정하는 것이 불가능합니다. 이것은 실제로 "저조한 물건을 자기에게하는 것"이라는 의미입니다. 객체는 자신의 ID를 변경할 수 없습니다 (메소드에'self '를 설정할 수 있더라도 메소드 외부에서 객체의 ID를 변경하지 않습니다 - 변수는 참조 만 사용합니다). 객체는 내부 상태 만 제어 할 수 있습니다. 그래서 내가 그런 식으로 바꿀 수있는 것을 나타내는 것이 좋습니다. – Chuck