프로그래밍에 대한 의견: Object#then으로 일회성 변수 제거

5181 단어 ruby
Ruby는 매우 다재다능한 언어입니다. OOP와 Functional 코드를 동시에 작성하는 데 사용할 수 있습니다. Ruby는 여러 메타 프로그래밍 기능도 제공합니다.

내가 좋아하게 된 Ruby 객체의 기능 중 하나는 메서드, 즉 #then 입니다.

블록, 프로시저 또는 람다를 허용합니다. 개체 자체를 유일한 인수로 수신하면 이러한 "콜백"은 개체의 상태를 수정하거나 "탭"할 수 있습니다. 결국 전달된 람다의 마지막 줄을 반환하며, 변수 내부에 저장하는 데 사용할 수 있습니다(형제#tap는 수행하지 않음)

Ruby의 모든 객체는 then 메서드에 응답합니다. 호출자(즉, 객체 자체)의 컨텍스트에서 전달된 proc을 평가한 다음 블록 내에서 실행된 마지막 줄을 반환합니다. 이 수업을 들어

class Person
  attr_reader :first_name, :last_name

  def initialize(first_name, last_name)
    @first_name = first_name
    @last_name = last_name
  end

  def name
    "#{first_name} #{last_name}"
  end
end


위의 이 Person 클래스가 주어지면 그 사람의 이름을 얻고 싶다고 가정해 봅시다. 우리는 이것을 할 수 있습니다,

user = Person.new "John", "Doe"

user_full_name = user.name


여기서 우리는 사용자 변수 안에 새로운 Person 개체를 저장하고 있습니다. 이 개체는 단일 위치에서만 사용하고 있습니다(이름을 콘솔에 기록하기 위해). 그때, 우리는 할 수 있습니다

user_full_name = Person.new("John", "Doe").then(&:name)


코드가 짧아졌습니다. 추가 변수(the user )를 저장하지 않기 때문에 이 코드가 실행된 후 가비지 수집기는 이 개체에 대한 참조가 더 이상 존재하지 않으므로 이 개체를 안전하게 제거할 수 있습니다.

이것은 조건문 내에서 정말 빛납니다. 이 스니펫은 Rails가 설치되어 있다고 가정합니다(또는 다른 데이터베이스 지원 테이블).

@buyer = if Buyer.find_by(id: 123).nil?
  SomeExternalService.api(...).then do |response|
    Buyer.create(response.body)
  end
else
  ## do something else
end

response를 변수에 저장한 다음 응답에서 Buyer.create를 수행할 필요가 없습니다. 다음은 then을 사용하지 않은 모습입니다.

@buyer = if Buyer.find_by(id: 123).nil?
  response = SomeExternalService.api(...)
  Buyer.create(response.body)
else
  ## do something else
end


개인적으로 Object#then는 말할 것도 없고 형제자매인 Object#tap를 점점 더 좋아하게 되었습니다.

끝까지 함께해주셔서 감사합니다. 즐거운 시간 되셨길 바라며, 즐거운 하루 보내시고 행복한 코딩 되세요.

자원


  • Object#then
  • 좋은 웹페이지 즐겨찾기