루비: 본인
4300 단어 rubyfirstyearincodeoopbeginners
지난 3주 동안 저는 변수와 메소드에서 데이터 구조에 이르기까지 Ruby 절차적 프로그래밍 개념에 몰두했습니다. 객체지향 프로그래밍(OOP)을 진행했습니다. 일주일 내내 나는 @, @@, 자기 자신의 용법을 이해하기 위해 고군분투했습니다. 셀 수 없이 많은 시간을 조사한 후, 이제 객체 관계에서 클래스를 구성하고 @, @@ 및 self를 구현하는 것이 더 편해졌습니다.
좋아, 우리는 클래스가 본질적으로 청사진 또는 공장이라는 것을 이해합니다. 속성과 동작을 공유하는 인스턴스를 생성합니다. 나는 보육원에 대한 나의 부차적 관심의 연장선으로 내 생각을 반복하기 위해 식물을 사용할 것입니다.
class Plant
def name=(name)
@name = name
end
def name
@name
end
end
cactus = Plant.new("Cactus")
cactus.name = "Cactus"
이것은 기본 판독기 및 getter 메서드가 있는 예비 클래스 범위입니다. "Cactus"는 Plant 클래스의 인스턴스입니다.
@와 @@가 무엇인가요?
@는 인스턴스 변수이고 @@는 클래스 변수입니다. 인스턴스 및 클래스 메서드를 통과할 수 있습니다. 이것을 로컬 변수의 업그레이드 버전이라고 합니다. Plant 클래스를 수정해 보겠습니다.
class Plant
@@all = []
def name=(name)
@name = name
end
def name
@name
end
def save
@@all << self
end
def self.all
@@all
end
def self.chatty_plant
self.all.each do |plant|
puts "I am #{@name}. Water me please!"
end
end
end
Ruby 클래스에 대한 이전 접근 방식에서는 단순히 인스턴스 및 클래스 메서드에서 @instance_variable 및 @@class_variable을 참조했습니다. 그들은 일했고 나는 시험에 합격했습니다. 더 복잡한 계획을 진행함에 따라 이 정신적 모델링 접근 방식은 덜 직관적이 되었습니다. @@class_variable의 이름을 @@something_else로 바꾸면 어떻게 될까요? 모든 @@class_variable의 이름을 바꿔야 합니다. @instance_variable을 @instance_varyable로 잘못 입력하면 어떻게 됩니까? Ruby가 이 실수를 잡는 데 도움이 될까요?
자아의 상승
나는 이것이 우리가 self를 활용하고 Ruby 클래스를 보다 직관적으로 구성해야 할 때라고 생각합니다. @ 및 @@를 참조하는 것은 문자 그대로의 접근 방식이며 self를 사용하면 개체가 고유하게 작동할 수 있습니다. Self는 프로그램이 작동하는 main 또는 자체를 나타냅니다. 인스턴스 메소드에서 self는 인스턴스 자체를 참조하고 클래스 메소드에서 self는 클래스 자체를 참조합니다. 아래의 첫 번째 대체 접근 방식을 살펴보겠습니다.
def save
@@all << self
end
def save
self.class.all << self
end
@@all을 self.class.all로 리팩토링할 수 있습니다.
@@모두 == @@모두
Plant.class == @@모두
self.class.all == @@모두
@@all 대신 self.class.all을 사용하는 이유는 무엇입니까?
코드가 점차 복잡해짐에 따라 인스턴스 또는 클래스 메서드를 구체화하고 리팩터링하는 것이 좋습니다. self.class.all을 사용하면 클래스 변수의 이름을 바꿀 때 발생할 수 있는 오류 구문을 피할 수 있습니다.
def self.chatty_plant
self.all.each do |plant|
puts "I am #{@name}. Water me please!"
end
end
def self.chatty_plant
all.each do |plant|
puts "I am #{name}. Water me please!"
end
end
self.all.each do에 self가 필요한가요?
self.chatty_plant는 클래스 메서드이고, self.all도 클래스 메서드입니다. self.all.each do에서 self를 생략할 수 있습니다. Ruby는 이 클래스 메서드에서 self를 암시적 수신자로 이해합니다.
#{@이름} 대 #{이름}
#{@naame}을 잘못 입력하면 Ruby는 존재하지 않는 인스턴스 변수 @naame을 찾습니다.
#=> I am . Water me please!
Ruby에서 더 나은 접근 방식은 인스턴스 메서드를 호출하는 것입니다. #{name} 대신 #{naame}과 같은 오타가 있으면 Ruby가 오류를 탐색하는 데 도움이 됩니다.
#=> NameError (undefined local variable or method 'naame'..)
이 자기 정신 모델링은 코드가 Ruby 구현에서 더 복잡한 속성과 동작을 얻음에 따라 더 나은 설계 접근 방식을 허용합니다.
class Plant
@@all = []
def name=(name)
@name = name
end
def name
@name
end
def save
self.class.all << self
end
def self.all
@@all
end
def self.chatty_plant
all.each do |plant|
puts "I am #{name}. Water me please!"
end
end
end
진정하고 코드를 켜십시오.
fentybit | GitHub | |
Reference
이 문제에 관하여(루비: 본인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/fentybit/ruby-self-8if텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)