다음 Symbol
과 같이 간단한 패치를 만들 수 있습니다 .
class Symbol
def with(*args, &block)
->(caller, *rest) { caller.send(self, *rest, *args, &block) }
end
end
이를 통해 다음을 수행 할 수 있습니다.
a = [1,3,5,7,9]
a.map(&:+.with(2))
# => [3, 5, 7, 9, 11]
그러나 여러 매개 변수를 전달하는 것과 같은 다른 멋진 기능도 많이 있습니다.
arr = ["abc", "babc", "great", "fruit"]
arr.map(&:center.with(20, '*'))
# => ["********abc*********", "********babc********", "*******great********", "*******fruit********"]
arr.map(&:[].with(1, 3))
# => ["bc", "abc", "rea", "rui"]
arr.map(&:[].with(/a(.*)/))
# => ["abc", "abc", "at", nil]
arr.map(&:[].with(/a(.*)/, 1))
# => ["bc", "bc", "t", nil]
그리고 inject
두 개의 인수를 블록에 전달하는을 사용하여 작업 할 수도 있습니다 .
%w(abecd ab cd).inject(&:gsub.with('cde'))
# => "cdeeecde"
또는 [속기] 블록 을 속기 블록 으로 전달하는 것과 같은 멋진 기능 :
[['0', '1'], ['2', '3']].map(&:map.with(&:to_i))
# => [[0, 1], [2, 3]]
[%w(a b), %w(c d)].map(&:inject.with(&:+))
# => ["ab", "cd"]
[(1..5), (6..10)].map(&:map.with(&:*.with(2)))
# => [[2, 4, 6, 8, 10], [12, 14, 16, 18, 20]]
다음은 @ArupRakshit과 더 자세히 설명하는 대화
입니다. Ruby에서 map (& : method) 구문에 인수를 제공 할 수 있습니까?
@amcaplan이에 제안으로 아래의 코멘트 는 이름을 바꿀 경우, 당신은 짧은 구문을 만들 수 with
에 방법을 call
. 이 경우, 루비에는이 특별한 방법에 대한 단축키가 내장되어 .()
있습니다.
따라서 위와 같이 사용할 수 있습니다.
class Symbol
def call(*args, &block)
->(caller, *rest) { caller.send(self, *rest, *args, &block) }
end
end
a = [1,3,5,7,9]
a.map(&:+.(2))
# => [3, 5, 7, 9, 11]
[(1..5), (6..10)].map(&:map.(&:*.(2)))
# => [[2, 4, 6, 8, 10], [12, 14, 16, 18, 20]]