&(앰퍼샌드) 연산자를 사용하는 Ruby 반복 단축키



Ruby가 내가 가장 좋아하는 언어인 이유 중 하나는 바로 가기가 많고 몇 줄의 코드로 많은 작업을 수행할 수 있기 때문입니다. & (앰퍼샌드) 연산자가 좋은 예입니다.
&가 Ruby에서 작동하는 방식에 대한 간단한 설명:

# These two calls are equivalent:

numbers.select { |number| number.even? }

numbers.select(&:even?)

&는 위의 예에서 기호to_proc인 다음 개체에서 :even? 메서드를 호출합니다. (to_proc 메서드는 기호에서 구현됩니다.) 이는 개체가 코드 블록(Proc 개체)으로 캡슐화되고 지정된 메서드로 전달됨을 의미합니다.
.even?는 Ruby에 내장된 메서드이기 때문에 처음에 나에게 그랬던 것처럼 여전히 이상하게 보일 수 있습니다. 왜 상징으로 사용할 수 있습니까? 이는 Ruby의 메서드 이름이 내부적으로 기호로 저장되기 때문에 작동합니다. 같은 이유로 정의하는 메소드에 대해서도 이 단축키&를 사용할 수 있습니다.

매일 사용하는 Ruby Enumerable의 예를 살펴보겠습니다.

1. 찾기




# Returns the first admin user

# BAD
def find_admin(users)
  users.find { |user| user.admin? }
end

# GOOD
def find_admin(users)
  users.find(&:admin?)
end



2. 선택




# Returns all the admin users

# BAD
def find_admins(users)
  admins = []
  users.each do |user|
    admins << user if user.admin?
  end
  admins
end

# GOOD
def find_admins(users)
  users.select(&:admin?)
end



3. 카운트




# Returns the number of the admin users

# BAD
def count_admin(users)
  count = 0
  users.each do |user|
    count += 1 if user.admin?
  end
  count
end

# GOOD
def count_admin(users)
  users.count(&:admin?)
end



4. 지도




# Returns an array of each user's name

# BAD
def user_names(users)
  names = []
  users.each do |user|
    names << user.name
  end
  names
end

# GOOD
def user_names(users)
  users.map(&:name)
end



5. 아무거나?




# Returns true if at least one user exists.

# BAD
def contains_nil?(users)
  users.each do |user|
    return true if user.nil?
  end
  false
end

# GOOD
def contains_nil?(users)
  users.any?(&:nil?)
end



6. 최대 / 최대_비




# Returns the oldest user.

# BAD
def oldest_user(users)
  oldest = nil
  users.each do |user|
    oldest = user if oldest.nil? || user.age > oldest.age
  end
  oldet
end

# GOOD
def oldest_user(users)
  users.max_by(&:age)
end



이것을 알면 단순히 object.method를 반환하는 블록을 사용하여 배열을 반복할 때 코드 냄새를 감지하고 대신 & 연산자를 사용하는 것을 고려할 것입니다.

좋은 웹페이지 즐겨찾기