Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby의 구문 설탕 메서드

새로운 Ruby Magic 기사에 오신 것을 환영합니다! 이 에피소드에서는 Ruby가 구문 설탕을 사용하는 방법을 살펴보겠습니다. 구문 중 일부를 더 표현력 있게 만들거나 읽기 쉽게 만듭니다. 마지막으로 Ruby의 몇 가지 트릭이 내부에서 어떻게 작동하는지와 이 설탕을 약간 사용하는 자체 메서드를 작성하는 방법을 알게 될 것입니다.

Ruby 앱을 작성할 때 비표준적으로 느껴질 수 있는 방식으로 클래스 속성, 배열 및 해시와 상호 작용하는 것이 일반적입니다. 속성을 할당하고 배열이나 해시에서 값을 가져오는 메서드를 어떻게 정의할까요?

Ruby는 이러한 메서드를 호출할 때 작동하도록 약간의 구문 설탕을 제공합니다. 이 게시물에서 우리는 그것이 어떻게 작동하는지 알아볼 것입니다.

person1 = Person.new
person1.name = "John"
 
array = [:foo, :bar]
array[1]  # => :bar
 
hash = { :key => :foo }
hash[:key] # => :foo
hash[:key] = :value

구문 설탕?

구문 설탕은 약간의 ✨ 마법 ✨ Ruby 를 참조하여 더 읽기 쉽고 간결한 코드를 작성할 수 있습니다. Ruby에서 이는 특정 기호, 공백을 생략하거나 일종의 도우미를 사용하여 일부 표현을 작성하는 것을 의미합니다.

메서드 이름

메서드 이름부터 시작하겠습니다. Ruby에서는 다른 언어에서 일반적으로 지원되지 않는 모든 종류의 문자와 특수 기호를 메서드 이름에 사용할 수 있습니다. Rails 앱을 작성한 적이 있다면 아마도 save!를 접했을 것입니다. 방법. 이것은 Rails에만 해당되는 것은 아니지만 !에 대한 지원을 보여줍니다. Ruby 메소드 이름의 문자.

=와 같은 다른 기호에도 동일하게 적용됩니다. , [ , ] , ? , % , & , | , < , > , * , - , +/ .

이러한 문자에 대한 지원은 해당 문자를 메서드 이름에 통합하여 해당 문자의 용도를 보다 명확하게 할 수 있음을 의미합니다.

  • 속성 할당:person.name = "foo"
  • 질문:person.alive?
  • 위험한 메소드 호출:car.destroy!
  • 객체가 아닌 것처럼 행동하게 만들기:car[:wheels]

속성 메소드 정의

attr_accessor를 사용하여 클래스의 속성을 정의할 때 , Ruby는 클래스의 인스턴스 변수에 대한 판독기 및 작성기 메서드를 만듭니다.

class Person
  attr_accessor :name
end
 
person = Person.new
person.name = "John"
person.name # => "John"

내부적으로 Ruby는 두 가지 방법을 만듭니다.

  • Person#name attr_reader를 사용하여 클래스의 속성/인스턴스 변수 읽기 , 그리고;
  • Person#name= attr_writer를 사용하여 클래스에 속성/인스턴스 변수 쓰기 .

이제 이 동작을 사용자 정의한다고 가정해 보겠습니다. attr_accessor는 사용하지 않습니다. 도우미를 만들고 메서드를 직접 정의합니다.

class AwesomePerson
  def name
    "Person name: #{@name}"
  end
 
  def name=(value)
    @name = "Awesome #{value}"
  end
end
 
person = AwesomePerson.new
person.name = "Jane"
person.name # => "Person name: Awesome Jane"

name=에 대한 메소드 정의 person.name = "Jane" 메서드를 호출할 때 작성하는 방식과 거의 같습니다. . 등호 = 주위에 공백을 정의하지 않습니다. 메소드를 호출할 때 괄호를 사용하지 마십시오.

선택적인 괄호 및 공백

Ruby에서 괄호는 선택 사항인 경우가 많습니다. 메서드에 인수를 전달할 때 인수를 괄호 ()로 묶을 필요가 없습니다. , 하지만 읽기 쉽다면 할 수 있습니다.

if 문은 좋은 예입니다. 많은 언어에서 if 문은 괄호로 평가되는 표현식을 래핑합니다. Ruby에서는 생략할 수 있습니다.

puts "Hello!" if (true) # With optional parentheses
puts "Hello!" if true   # Without parentheses

메소드 정의 및 기타 표현식에도 동일하게 적용됩니다.

def greeting name # Parentheses omitted
  "Hello #{name}!"
end
 
greeting("Robin") # With parentheses
greeting "Robin"  # Without parentheses
greeting"Robin"   # Without parentheses and spaces

마지막 줄은 읽기 어렵지만 작동합니다. 메서드 호출 시에도 괄호와 공백은 선택 사항입니다.

모든 괄호와 공백을 생략하지 않도록 주의하십시오. 이 중 일부는 Ruby가 의미하는 바를 이해하는 데 도움이 됩니다! 확실하지 않은 경우 인수를 괄호로 묶어 사용자와 Ruby가 어떤 인수가 어떤 메서드 호출에 속하는지 알 수 있도록 합니다.

메서드를 호출하는 다음 방법이 모두 지원되지만 일반적으로 코드를 좀 더 읽기 쉽게 만들기 위해 괄호를 생략하고 공백을 추가합니다.

# Previous method definition:
# def name=(value)
#   @name = "Awesome #{value}"
# end
 
person.name = "Jane"
person.name="Jane"
person.name=("Jane") # That looks a lot like the method definition!

이제 name에 대한 사용자 정의 속성 판독기 및 작성기 메서드를 정의했습니다. 기인하다. 콜백을 사용하지 않고 속성을 할당할 때 필요에 따라 동작을 사용자 정의하고 값에 직접 변환을 수행할 수 있습니다.

[ ] 정의 방법

다음으로 살펴볼 것은 대괄호 메서드 [ ]입니다. 루비에서. 이들은 일반적으로 배열 인덱스 및 해시 키에 값을 가져오고 할당하는 데 사용됩니다.

hash = { :foo => :bar, :abc => :def }
hash[:foo]        # => :bar
hash[:foo] = :baz # => :baz
 
array = [:foo, :bar]
array[1] # => :bar

이러한 메서드가 어떻게 정의되는지 살펴보겠습니다. hash[:foo]를 호출할 때 우리는 이 작업을 수행하기 위해 Ruby 구문 설탕을 사용하고 있습니다. 이것을 작성하는 또 다른 방법은 다음과 같습니다.

hash = { :foo => :bar }
hash.[](:foo)
hash.[]=(:foo, :baz)
# or even:
hash.send(:[], :foo)
hash.send(:[]=, :foo, :baz)

우리가 이것을 일반적으로 작성하는 방식(hash[:foo]hash[:foo] = :baz ) 우리는 이미 몇 가지 차이점을 볼 수 있습니다. 첫 번째 예(hash.[](:foo) ) Ruby는 대괄호(hash[:foo]) 사이의 첫 번째 인수를 이동합니다. ). hash.[]=(:foo, :baz)를 호출할 때 두 번째 인수는 hash[:foo] = :baz 값으로 메서드에 전달됩니다. .

이것을 알면 이제 우리 자신의 [ ]를 정의할 수 있습니다. 및 [ ]= Ruby가 이해할 수 있는 방법입니다.

class MyHash
  def initialize
    @internal_hash = {}
  end
 
  def [](key)
    @internal_hash[key]
  end
 
  def []=(key, value)
    @internal_hash[key] = value
  end
end

이제 이러한 메서드가 일반적인 Ruby 메서드라는 것을 알았으므로 다른 메서드와 동일한 논리를 적용할 수 있습니다. [ ]에서 여러 키를 허용하는 것과 같은 이상한 일을 하도록 만들 수도 있습니다. 방법.

class MyHash
  def initialize
    @internal_hash = { :foo => :bar, :abc => :def }
  end
 
  def [](*keys)
    @internal_hash.values_at(*keys)
  end
end
 
hash = MyHash.new
hash[:foo, :abc] # => [:bar, :def]

나만의 만들기

이제 Ruby의 구문 설탕에 대해 조금 알게 되었으므로 이 지식을 적용하여 사용자 지정 작성기, 해시와 같은 클래스 등과 같은 고유한 메서드를 만들 수 있습니다.

실제로는 그렇지 않을 때 배열이나 해시처럼 느껴지도록 하기 위해 대괄호 메서드와 같은 메서드를 정의하는 gem이 얼마나 많은지 알 수 있습니다. 한 가지 예는 다음을 사용하여 Rails 애플리케이션에서 플래시 메시지를 설정하는 것입니다.
flash[:alert] = "An error occurred" . AppSignal gem에서는 Config에서 이것을 직접 사용합니다. 구성을 가져오기 위한 약식 클래스입니다.

이것으로 메서드 정의 및 Ruby 호출에 대한 구문 설탕에 대한 간략한 살펴보기를 마칩니다. 이 기사가 얼마나 마음에 들었는지, 기사에 대해 질문이 있거나 다음에 읽고 싶은 내용이 있으면 @AppSignal로 알려주시기 바랍니다.