루비 대상 지식 요약
클래스는 대상을 지정하는 형식에 사용되며 데이터 표현법과 방법을 결합하여 데이터를 가지런한 패키지로 정리한다.클래스 중의 데이터와 방법은 클래스의 구성원이라고 불린다.
루비 클래스 정의
클래스를 정의할 때, 데이터 형식의 청사진을 실제로 정의합니다.이것은 실제로 어떤 데이터도 정의하지 않고 클래스의 이름이 무엇을 의미하는지, 즉 클래스의 대상이 무엇으로 구성되는지, 그리고 그 대상에서 어떤 조작을 할 수 있는지를 정의했다.
클래스 정의는 키워드class로 시작하고 클래스 이름을 따라가며 마지막으로end로 구분하여 클래스 정의를 종료합니다.예를 들어, 다음과 같이 키워드 class를 사용하여 Box 클래스를 정의합니다.
class Box
code
end
관례에 따라 이름은 대문자로 시작해야 합니다. 여러 단어가 포함된 경우 각 단어의 대문자는 대문자로 시작하지만 이 사이에는 구분자가 없습니다(예: CamelCase).루비 객체 정의
클래스는 대상의 청사진을 제공하기 때문에 기본적으로 대상은 클래스에 따라 창설된다.우리는 new 키워드 성명 클래스의 대상을 사용합니다.다음 구문은 클래스 Box의 두 객체를 나타냅니다.
box1 = Box.new
box2 = Box.new
initialize 방법initialize 방법은 표준적인 루비 클래스 방법으로 클래스의 구조 함수이며 다른 대상 프로그래밍 언어의constructor 작업 원리와 유사하다.대상을 만드는 동시에 클래스 변수를 초기화하려면 initialize 방법이 도움이 됩니다.이 방법은 다른 Ruby 방법과 마찬가지로 def 키워드를 앞에 배치해야 합니다. 아래와 같습니다.
class Box
def initialize(w,h)
@width, @height = w, h
end
end
인스턴스 변수실례 변수는 클래스 속성입니다. 클래스를 사용하여 대상을 만들 때 대상의 속성이 됩니다.각 객체의 속성은 개별적으로 지정되며 다른 객체와 값이 공유되지 않습니다.클래스 내부에서는 @ 연산자를 사용하여 이러한 속성에 접근하고, 클래스 외부에서는 방문자 방법이라고 불리는 공통 방법으로 접근합니다.다음은 위에서 정의한 클래스 박스를 실례로 삼아 @width와 @height를 클래스 박스의 실례 변수로 삼겠습니다.
class Box
def initialize(w,h)
#
@width, @height = w, h
end
end
접근기 (getter) & 설정기 (setter) 방법클래스의 외부에서 클래스에 정의된 변수를 읽기 위해서, 접근기 (getter) 방법을 정의해서 접근할 수 있습니다.다음 예제에서는 Acceler 방법의 사용법을 보여 줍니다.
#!/usr/bin/ruby -w
#
class Box
#
def initialize(w,h)
@width, @height = w, h
end
#
def printWidth
@width
end
def printHeight
@height
end
end
# ,
box = Box.new(10, 20)
#
x = box.printWidth()
y = box.printHeight()
puts " : #{x}"
puts " : #{y}"
위의 코드가 실행되면 다음과 같은 결과가 발생합니다.상자 너비: 10
상자 높이: 20
Ruby는 변수 값에 액세스하는 데 사용되는 접근 방법과 유사하게 클래스 외부에서 클래스에 정의된 변수를 전달하는 방법을 제공합니다. 즉, 설정기 방법입니다. 정의는 다음과 같습니다.
#!/usr/bin/ruby -w
#
class Box
#
def initialize(w,h)
@width, @height = w, h
end
#
def getWidth
@width
end
def getHeight
@height
end
#
def setWidth=(value)
@width = value
end
def setHeight=(value)
@height = value
end
end
#
box = Box.new(10, 20)
#
box.setWidth = 30
box.setHeight = 50
#
x = box.getWidth()
y = box.getHeight()
puts " : #{x}"
puts " : #{y}"
위의 코드가 실행되면 다음과 같은 결과가 발생합니다.상자 너비: 30
상자 높이: 50
두 가지 방법이 매우 자주 사용되기 때문에, 루비는attr_를 정의했다accessor :variable_name、attr_reader :variable_name、attr_writer :variable_name 세 가지 속성 성명 방법.그 중에서:accessor=reader+writer.
동시에 주의: 변수 이름 앞에는 반드시 가지고 있어야 한다. 변수 이름 사이에는 사용하고 분할해야 한다.
실례 방법
실례 방법의 정의는 다른 방법의 정의와 마찬가지로 def 키워드를 사용하지만, 클래스 실례를 통해서만 사용할 수 있습니다. 아래 실례와 같습니다.그것들의 기능은 실례 변수에 접근하는 것에 국한되지 않고 당신의 요구에 따라 더 많은 다른 작업을 할 수 있습니다.
#!/usr/bin/ruby -w
#
class Box
#
def initialize(w,h)
@width, @height = w, h
end
#
def getArea
@width * @height
end
end
#
box = Box.new(10, 20)
#
a = box.getArea()
puts "Area of the box is : #{a}"
위의 코드가 실행되면 다음과 같은 결과가 발생합니다.Area of the box is : 200
클래스 방법 & 클래스 변수
클래스 변수는 클래스의 모든 실례에서 공유되는 변수입니다.다시 말하면 클래스 변수의 실례는 모든 대상의 실례에 접근할 수 있다.클래스 변수는 두 개의 @ 문자 (@@) 를 접두사로 하고 클래스 변수는 클래스 정의에서 초기화되어야 합니다. 아래와 같습니다.
클래스 방법은 defself를 사용합니다.methodname () 정의, 클래스 방법은end 구분자로 끝납니다.클래스 방법은 클래스 이름이 있는classname를 사용할 수 있습니다.methodname 형식 호출, 아래 예와 같이:
#!/usr/bin/ruby -w
class Box
#
@@count = 0
def initialize(w,h)
#
@width, @height = w, h
@@count += 1
end
def self.printCount()
puts "Box count is : #@@count"
end
end
#
box1 = Box.new(10, 20)
box2 = Box.new(30, 100)
#
Box.printCount()
위의 코드가 실행되면 다음과 같은 결과가 발생합니다.Box count is : 2
to_방법
정의된 모든 클래스에는 to_s 실례 방법은 대상의 문자열 표시 형식을 되돌려줍니다.다음은 width와 height에 따라 Box 대상을 나타내는 간단한 실례입니다.
#!/usr/bin/ruby -w
class Box
#
def initialize(w,h)
@width, @height = w, h
end
# to_s
def to_s
"(w:#@width,h:#@height)" #
end
end
#
box = Box.new(10, 20)
# to_s
puts "String representation of box is : #{box}"
위의 코드가 실행되면 다음과 같은 결과가 발생합니다.String representation of box is : (w:10,h:20)
액세스 제어
루비는 퍼블릭,private 또는protected 등 세 가지 단계의 실례 방법을 제공합니다.Ruby는 인스턴스와 클래스 변수에 액세스 제어를 적용하지 않습니다.
#!/usr/bin/ruby -w
#
class Box
#
def initialize(w,h)
@width, @height = w, h
end
# public
def getArea
getWidth() * getHeight
end
# private
def getWidth
@width
end
def getHeight
@height
end
# make them private
private :getWidth, :getHeight
#
def printArea
@area = getWidth() * getHeight
puts "Big box area is : #@area"
end
# protected
protected :printArea
end
#
box = Box.new(10, 20)
#
a = box.getArea()
puts "Area of the box is : #{a}"
# protected
box.printArea()
위의 코드가 실행될 때 다음과 같은 결과가 발생합니다.여기서 첫 번째 방법은 호출에 성공했지만 두 번째 방법은 문제가 생길 수 있다.Area of the box is : 200
test.rb:42: protected method `printArea' called for #
계승
계승은 대상 프로그래밍에서 가장 중요한 개념 중의 하나이다.계승은 다른 클래스에 따라 하나의 클래스를 정의할 수 있도록 합니다. 이렇게 하면 프로그램을 만들고 유지하는 것이 더욱 쉽습니다.
상속은 코드를 다시 사용하고 신속하게 실행하는 데 도움이 됩니다. 불행하게도 루비는 다중 상속을 지원하지 않지만 루비는mixins를 지원합니다.mixin은 다계승의 특정한 실현과 같이 다계승에서 인터페이스 부분만 계승할 수 있다.
클래스를 만들 때, 프로그래머는 새로운 클래스가 기존의 클래스에서 계승되는 구성원을 직접 지정할 수 있으며, 이렇게 하면 처음부터 새로운 데이터 구성원과 구성원 함수를 작성하지 않아도 된다.이 기존 클래스는 기류 또는 부류라고 불리고, 새로운 클래스는 파생류 또는 자류라고 불린다.
루비도 자류화의 개념을 제공했다. 자류화는 계승이다. 아래의 실례는 이 개념을 설명했다.하나의 종류를 확장하는 문법은 매우 간단하다.클래스 문장에 <문자와 상위 클래스의 이름을 추가하면 됩니다.예를 들어, 클래스 BigBox는 Box의 하위 클래스입니다.
#!/usr/bin/ruby -w
#
class Box
#
def initialize(w,h)
@width, @height = w, h
end
#
def getArea
@width * @height
end
end
#
class BigBox < Box
#
def printArea
@area = @width * @height
puts "Big box area is : #@area"
end
end
#
box = BigBox.new(10, 20)
#
box.printArea()
위의 코드가 실행되면 다음과 같은 결과가 발생합니다.Big box area is : 200
방법 재부팅
파생 클래스에 새로운 기능을 추가할 수 있지만, 부모 클래스에 정의된 방법의 행동을 바꾸려고 할 수도 있습니다.이 경우 메소드 이름을 그대로 유지하고, 메소드 기능을 다시 로드하면 됩니다.
#!/usr/bin/ruby -w
#
class Box
#
def initialize(w,h)
@width, @height = w, h
end
#
def getArea
@width * @height
end
end
#
class BigBox < Box
# getArea
def getArea
@area = @width * @height
puts "Big box area is : #@area"
end
end
#
box = BigBox.new(10, 20)
#
box.getArea()
위의 인스턴스 실행 출력 결과는 다음과 같습니다.Big box area is : 200
연산자 재부팅
우리는 + 연산자를 사용하여 두 개의 Box 대상의 벡터 덧셈을 실행하고, * 연산자를 사용하여 Box의width와height를 곱하고, 일원 연산자를 사용하여 - Box의width와height를 반전시키기를 희망합니다.다음은 수학 연산자로 정의된 Box 클래스 버전입니다.
class Box
def initialize(w,h) # width height
@width,@height = w, h
end
def +(other) # +
Box.new(@width + other.width, @height + other.height)
end
def -@ # - width height
Box.new(-@width, -@height)
end
def *(scalar) #
Box.new(@width*scalar, @height*scalar)
end
end
객체 동결때때로 우리는 대상이 바뀌는 것을 방지하고 싶다.Object에서freeze 방법은 이 점을 실현할 수 있으며, 대상을 효과적으로 상량으로 만들 수 있다.모든 객체는 Object를 호출할 수 있습니다.freeze 동결.동결된 객체는 수정할 수 없습니다. 즉, 인스턴스 변수를 변경할 수 없습니다.
Object를 사용할 수 있습니다.frozen? 방법은 주어진 대상이 동결되었는지 확인합니다.대상이 동결되면, 이 방법은true를 되돌려줍니다. 그렇지 않으면false 값을 되돌려줍니다.다음 예제에서는 이 개념을 설명합니다.
#!/usr/bin/ruby -w
#
class Box
#
def initialize(w,h)
@width, @height = w, h
end
#
def getWidth
@width
end
def getHeight
@height
end
#
def setWidth=(value)
@width = value
end
def setHeight=(value)
@height = value
end
end
#
box = Box.new(10, 20)
#
box.freeze
if( box.frozen? )
puts "Box object is frozen object"
else
puts "Box object is normal object"
end
#
box.setWidth = 30
box.setHeight = 50
#
x = box.getWidth()
y = box.getHeight()
puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"
위의 코드가 실행되면 다음과 같은 결과가 발생합니다.Box object is frozen object
test.rb:20:in `setWidth=': can't modify frozen object (TypeError)
from test.rb:39
클래스 상량
클래스 내부에서 상수를 정의할 수 있습니다. 변수에 직접적인 수치나 문자열 값을 부여해서 정의할 수 있습니다. 상수의 정의는 @ 또는 @를 사용할 필요가 없습니다.관례에 따라 상량의 명칭은 대문자를 사용한다.
상수가 정의되면 값을 바꿀 수 없습니다. 클래스 내부에서 상수에 직접 접근할 수 있습니다. 마치 변수에 접근하는 것과 같습니다. 그러나 클래스의 외부 접근 상수를 원한다면classname::constant를 사용해야 합니다. 아래의 실례와 같습니다.
#!/usr/bin/ruby -w
#
class Box
BOX_COMPANY = "TATA Inc"
BOXWEIGHT = 10
#
def initialize(w,h)
@width, @height = w, h
end
#
def getArea
@width * @height
end
end
#
box = Box.new(10, 20)
#
a = box.getArea()
puts "Area of the box is : #{a}"
puts Box::BOX_COMPANY
puts "Box weight is: #{Box::BOXWEIGHT}"
위의 코드가 실행되면 다음과 같은 결과가 발생합니다.Area of the box is : 200
TATA Inc
Box weight is: 10
클래스 상수는 계승될 수도 있고 실례적인 방법처럼 다시 불러올 수도 있다.
allocate를 사용하여 객체 만들기
대상 구조기 initialize를 호출하지 않은 상태에서 대상을 만들려는 경우, 즉 new 방법으로 대상을 만들려는 경우, 이 경우 allocate를 호출하여 초기화되지 않은 대상을 만들 수 있습니다. 아래와 같습니다.
#!/usr/bin/ruby -w
#
class Box
attr_accessor :width, :height
#
def initialize(w,h)
@width, @height = w, h
end
#
def getArea
@width * @height
end
end
# new
box1 = Box.new(10, 20)
# allocate
box2 = Box.allocate
# box1
a = box1.getArea()
puts "Area of the box is : #{a}"
# box2
a = box2.getArea()
puts "Area of the box is : #{a}"
위의 코드가 실행되면 다음과 같은 결과가 발생합니다.Area of the box is : 200
test.rb:14: warning: instance variable @width not initialized
test.rb:14: warning: instance variable @height not initialized
test.rb:14:in `getArea': undefined method `*'
for nil:NilClass (NoMethodError) from test.rb:29
클래스 정보
루비의 self와 자바의this는 비슷한 점이 있지만 크게 다르다.Java의 방법은 모두 실례 방법에서 인용되기 때문에this는 일반적으로 현재 대상을 가리킨다.루비의 코드는 한 줄씩 실행되기 때문에 서로 다른 상하문(context)self에 서로 다른 의미가 있다.아래의 실례를 봅시다.
#!/usr/bin/ruby -w
class Box
#
puts "Class of self = #{self.class}"
puts "Name of self = #{self.name}"
end
위의 코드가 실행되면 다음과 같은 결과가 발생합니다.Class of self = Class
Name of self = Box
이것은 클래스 정의가 이 클래스를 현재 대상으로 실행할 수 있음을 의미하는 동시에 원류와 부류 중의 이 방법이 방법 정의가 실행되는 동안 사용할 수 있음을 의미한다.
다음은 Ruby 대상 지식에 대한 자세한 내용입니다. RUBY 대상 지식에 대한 더 많은 자료는 저희의 다른 관련 글에 주목하세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Ruby에서 문자열을 고정하는 다른 방법Ruby에서 문자열을 고정하려면 최소한 두 가지 방법이 있습니다. 아시다시피 a와 b는 동일한 개체 인스턴스인 것 같습니다. 문자열에 적용할 수 있는 일종의 이상한 메서드 입력: - 다음과 같은 코드를 볼 수 있습니...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.