(컴퓨터 과학의 폐쇄로 함) 블록, 프로세서 수와 람다 루비의 가장 강력한 측면 중 하나, 또한 가장 오해 중 하나입니다 . 이것은 루비가 다소 독특한 방식으로 클로저를 처리하기 때문일 것입니다. 일을 더 복잡하게 만드는 것은 루비가 네 가지 클로저 사용 방법을 가지고 있다는 것입니다. 각각의 클로저는 조금씩 다르며 때로는 무의미합니다. Ruby에서 클로저가 어떻게 작동하는지에 대한 아주 좋은 정보가있는 사이트가 꽤 많이 있습니다. 그러나 나는 아직 거기에 좋은, 확실한 가이드를 찾을 수 있습니다.
class Array
def iterate!(&code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array = [1, 2, 3, 4]
array.iterate! do |n|
n ** 2
end
절차, AKA, 프로세서 수
블록 그러나 우리는 우리의 처분에 여러 블록이 그들에게 여러 번 사용할 수 있습니다, 매우 편리하고 구문 간단합니다. 따라서 같은 블록을 반복적으로 통과 시키려면 우리가 스스로를 반복해야합니다. 그러나 Ruby는 완전히 객체 지향적이므로 재사용 가능한 코드를 객체 자체로 저장하여 매우 명확하게 처리 할 수 있습니다. 이 재사용 가능한 코드를 Proc (프로 시저의 약자)라고합니다. 블록과 Procs의 유일한 차이점은 블록이 저장 될 수없는 Proc이기 때문에 한 번 사용하는 솔루션이라는 것입니다. 프로세서 수와의 협력을 통해, 우리는 다음과 같은 일을 시작할 수 있습니다
class Array
def iterate!(code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array_1 = [1, 2, 3, 4]
array_2 = [2, 3, 4, 5]
square = Proc.new do |n|
n ** 2
end
주면서
지금까지 당신이 사용한 프로세서 수를 두 가지 방법으로, 속성으로 직접 전달하고 변수로 저장. 이러한 Procs는 다른 언어가 익명 함수 또는 람다라고 부르는 것과 매우 유사하게 작동합니다. 더 재미있는 것들을 만들기 위해서, 람다도 루비 내에서 사용할 수 있습니다. 보세요 :
class Array
def iterate!(code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array = [1, 2, 3, 4]
array.iterate!(lambda { |n| n ** 2 })
puts array.inspect
블록
가장 많이, 가장 쉽고 틀림없이 "루비처럼"루비에서 클로저를 사용하는 방법은 블록입니다.
array = [1, 2, 3, 4]
array.collect! do |n|
n ** 2
end
puts array.inspect
# => [1, 4, 9, 16]
정말 고마워! – duykhoa
고마워요. 아주 좋은 예입니다.하지만 Fixnum을 검사 할 때 요점은 무엇입니까? – sekmo