10 개의 주사위 (말)를 굴린 결과가 포함 된 벡터가 필요합니다. 나는이 작업을 수행 할 수 있습니다map/collect와 함께 단항 메소드로`: rand`를 어떻게 사용합니까?
([6]*10).map{|x|rand(x)}
를하지만 나에게 "인자의 잘못된 번호"를 제공합니다 오류 :
([6]*10).map(:rand)
map
에 rand
의 한 인수 버전을 전달하는 지점이없는 방법이 있나요 ?
10 개의 주사위 (말)를 굴린 결과가 포함 된 벡터가 필요합니다. 나는이 작업을 수행 할 수 있습니다map/collect와 함께 단항 메소드로`: rand`를 어떻게 사용합니까?
([6]*10).map{|x|rand(x)}
를하지만 나에게 "인자의 잘못된 번호"를 제공합니다 오류 :
([6]*10).map(:rand)
map
에 rand
의 한 인수 버전을 전달하는 지점이없는 방법이 있나요 ?
이 작동합니다
([6]*10).map(&method(:rand))
이되지 않습니다
이([6]*10).map(&:rand)
Symbol#to_proc
는 (대략)과 같이 구현됩니다
class Symbol
def to_proc
-> *args { args.first.public_send(self, *args.drop(1)) }
end
end
즉, 첫 번째 인수는 수신자이고 다른 인수는 Symbol
이라는 메서드의 인수로 사용됩니다. 그래서, 귀하의 경우, 그것은 전화입니다
6.rand
계속해서 이상. 6
이 Integer
때문에
작품이 "의 종류", Integer
는 rand
을 정의 Kernel
에 혼합 Object
의 간접적 인 서브 클래스입니다. 그러나! rand
은 private
이며 이는 명시적인 수신자 없이만 호출 될 수 있음을 의미합니다. 또한, 당신이 public
했다 따라서 경우에도 인수를 전달하지 않습니다, 당신은 (방법에 Float
Method#to_proc
패스 모든 인수 반면
0과 1 인 인수없이 rand
의 동작을 얻을 것 결국 수신기가 묶여 있음).이 경우에는이 경우 호출 할 것입니다.
self.rand(6)
계속해서 반복해서 호출합니다. self
은 Object
이고, Object
은 Kernel
이고, rand
은 Kernel
입니다. map
이 매개 변수를하지 않는 단순한 이유를 들어
([6]*10).map(:rand)
을,하지만 당신은 인수를 전달하는 :
이 잘 작동하지 않습니다.
10.times.map { rand(6) }
을 작성하는이 방법으로 쉽게 rand
에 전달되는 인수 볼 수 있습니다 :
당신은 쓸 수 있습니다 :
이([6]*10).map(&method(:rand))
이 그것을 쓸 수있는 깨끗한 방법이 될 것입니다.
네, 고마워요,하지만 그 사실을 알고 있습니다. 실제 응용 프로그램에서는 모든 주사위가 같은면 수를 가지지 않으므로 벡터 위에'rand '를 매핑해야합니다. 나는 그 문제에 그 문제에 들어가기를 원하지 않았다. – rici
대단히 감사합니다.나는 종종 다른 사람들에게 이렇게 말하면서 충분한 정보가없는 곳에서 결론에 이르지 말았어야했다 .-(나에게 맞다.) 나에게는 조금 어색하지만 모든 언어마다 고유 한 관용구가있다. . – rici
기술적으로 OP의 경우 OP는 단순히 심볼을'map'에 전달하기 때문에 아무것도 호출하지 않고'map'은 블록 이외의 인수를 허용하지 않습니다. "private method'rand'가 6을 요구했습니다 : Fixnum" – engineersmnky
@engineersmnky : 아, 네 말이 맞아. OP가 게시 한 것이 의미가 없기 때문에 내 마음이 자동으로'&'로 채워진다. 'Symbol # to_proc'은'public_send'를 사용합니다. 좋은 생각입니다. (덧붙여 좋은 디자인 결정입니다.) –