2016-09-22 1 views
1

10 개의 주사위 (말)를 굴린 결과가 포함 된 벡터가 필요합니다. 나는이 작업을 수행 할 수 있습니다map/collect와 함께 단항 메소드로`: rand`를 어떻게 사용합니까?

([6]*10).map{|x|rand(x)} 

를하지만 나에게 "인자의 잘못된 번호"를 제공합니다 오류 :

([6]*10).map(:rand) 

maprand의 한 인수 버전을 전달하는 지점이없는 방법이 있나요 ?

답변

6

이 작동합니다

([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 

계속해서 이상. 6Integer 때문에

작품이 "의 종류", Integerrand을 정의 Kernel에 혼합 Object의 간접적 인 서브 클래스입니다. 그러나! randprivate이며 이는 명시적인 수신자 없이만 호출 될 수 있음을 의미합니다. 또한, 당신이 public했다 따라서 경우에도 인수를 전달하지 않습니다, 당신은 (방법에 FloatMethod#to_proc 패스 모든 인수 반면

0과 1 인 인수없이 rand의 동작을 얻을 것 결국 수신기가 묶여 있음).이 경우에는이 경우 호출 할 것입니다.

self.rand(6) 

계속해서 반복해서 호출합니다. selfObject이고, ObjectKernel이고, randKernel입니다. map이 매개 변수를하지 않는 단순한 이유를 들어

([6]*10).map(:rand) 

을,하지만 당신은 인수를 전달하는 :

이 잘 작동하지 않습니다.

10.times.map { rand(6) } 

을 작성하는이 방법으로 쉽게 rand에 전달되는 인수 볼 수 있습니다 :

+0

대단히 감사합니다.나는 종종 다른 사람들에게 이렇게 말하면서 충분한 정보가없는 곳에서 결론에 이르지 말았어야했다 .-(나에게 맞다.) 나에게는 조금 어색하지만 모든 언어마다 고유 한 관용구가있다. . – rici

+1

기술적으로 OP의 경우 OP는 단순히 심볼을'map'에 전달하기 때문에 아무것도 호출하지 않고'map'은 블록 이외의 인수를 허용하지 않습니다. "private method'rand'가 6을 요구했습니다 : Fixnum" – engineersmnky

+1

@engineersmnky : 아, 네 말이 맞아. OP가 게시 한 것이 의미가 없기 때문에 내 마음이 자동으로'&'로 채워진다. 'Symbol # to_proc'은'public_send'를 사용합니다. 좋은 생각입니다. (덧붙여 좋은 디자인 결정입니다.) –

3

당신은 쓸 수 있습니다 :

([6]*10).map(&method(:rand)) 
0

이 그것을 쓸 수있는 깨끗한 방법이 될 것입니다.

+0

네, 고마워요,하지만 그 사실을 알고 있습니다. 실제 응용 프로그램에서는 모든 주사위가 같은면 수를 가지지 않으므로 벡터 위에'rand '를 매핑해야합니다. 나는 그 문제에 그 문제에 들어가기를 원하지 않았다. – rici

관련 문제