메소드 정의에서 메소드 이름 뒤에 올 때 등호 ( '=') 기호는 무엇을합니까?
나는 이것을 스크린 캐스트에서 보았고이 경우 '='기호가 무엇을하는지 궁금했습니다.
def express_token=(token)
...
end
나는 그것이 이와 같은 것인지 이해할 것입니다.
def express_token(token = nil) 
위 (두 번째 코드 스 니펫)는 tokens 매개 변수의 기본값으로 nil을 설정하는 것을 의미합니다. 그러나 첫 번째 코드 조각에서 '='는 대괄호 밖에 있습니다.
미리 감사드립니다.
이 스 니펫은 가상 속성 (또는 "setter"메소드)을 정의하여 "express_token"이 메소드의 이름 일지라도 속성처럼 보이도록합니다. 예를 들면 :
class Foo
  def foo=(x)
    puts "OK: x=#{x}"
  end
end
f = Foo.new
f.foo = 123 # => 123
# OK: x=123
객체 "f"에는 "foo"라는 이름의 속성이나 인스턴스 변수가 없으므로 (필요하지도 않음) "foo ="메서드는 할당처럼 보이는 메서드 호출을 허용하는 구문 설탕 일뿐입니다. 또한 이러한 setter 메서드 는return 문이나 최종 값에 관계없이 항상 인수를 반환 합니다.
예를 들어 "irb"에서 최상위 setter 메서드를 정의하는 경우 Object 클래스에 메서드를 암시 적으로 추가하기 때문에 동작이 약간 혼란 스러울 수 있습니다. 예를 들면 :
def bar=(y)
  puts "OK: y=#{y}"
end
bar = 123 # => 123, sets the variable "bar".
bar # => 123
Object.new.bar = 123 # => 123, calls our method
# OK: y=123
Object.public_methods.grep /bar/ # => ["bar="]
이러한 메소드를 사용하면보다 간접적 인 방법으로 인스턴스 변수를 설정할 수 있습니다. 클래스가 있다고 상상해보세요. Person
class Person < ActiveRecord::Base
  attr_accessible :first_name, :last_name
  def full_name
    [@first_name, @last_name].join
  end
  def full_name=(name)
    @first_name, @last_name = name.split(" ")
  end
end
그런 다음 다음과 같이 할 수 있습니다.
p = Person.new
p.full_name = "John Doe"
p.first_name # => "John"
p.last_name # => "Doe"
p.full_name # => "John Doe"
실제로 함수 이름의 일부입니다. 따라서 getter 및 setter에 대해 기본값이 아닌 별도의 기능이 필요한 경우 setter입니다.
다음 예를 살펴 보겠습니다.
class NewDog  
  def initialize(breed)  
    @breed = breed  
  end
  # create reader only
  attr_reader :breed, :name 
  # setter method  
  def set_name(nm)  
    @name = nm  
  end  
end  
nd = NewDog.new('Doberman')  
nd.set_name('Benzy')  
puts nd.name  
setter 메서드를 다음과 같이 리팩터링하는 경우 :
def name=(nm)  
  @name = nm  
end 
다른 프로그래머는 name = 메소드가 setter 메소드로 작동한다는 것을 알고 있습니다. 또한 @maerics가 보여주는 것처럼 가상 속성처럼 작동합니다.
결과는 다음과 같습니다.
class NewDog  
  def initialize(breed)  
    @breed = breed  
  end  
  # create reader only  
  attr_reader :breed, :name 
  # setter method  
  def name=(nm)  
    @name = nm  
  end  
end  
nd = NewDog.new('Doberman')  
nd.name = 'Benzy'  
puts nd.name 
'Development Tip' 카테고리의 다른 글
| 종속성 속성에서 속성 변경 이벤트를 발생시키는 방법은 무엇입니까? (0) | 2020.12.04 | 
|---|---|
| 중요한 매개 변수 / 종속성이 누락 된 경우 어떤 예외가 발생합니까? (0) | 2020.12.04 | 
| 왜 C ++ 표준 문자열 클래스에서 파생되지 않아야합니까? (0) | 2020.12.04 | 
| UTF8을 사용한 MySQL 명령 줄 형식 (0) | 2020.12.04 | 
| MySQL VARCHAR 크기? (0) | 2020.12.04 |