문제

저는 배우려고 일부는 루비.상 반복하고 오랫동안 실행되는 프로세스,그리고 이 과정에서 내가 원하는 스피너로 필요합니다.

그래서 내가 할 수 있습니다.

a=['|','/','-','\\']
aNow=0
# ... skip setup a big loop
print a[aNow]
aNow += 1
aNow = 0 if aNow == a.length
# ... do next step of process
print "\b"

그러나 내가 생각할 것을:

def spinChar
  a=['|','/','-','\\']
  a.cycle{|x| yield x}
end
# ... skip setup a big loop
print spinChar
# ... do next step of process
print "\b"

물론 spinChar 부르고 싶어 합니다.면 나는 그것에게 그것을 차단할 것을 걸기이다.

어떻게 그는 다음의 항복 이 block?

도움이 되었습니까?

해결책

루비스 yield 에서 작동하지 않는 방식을 예고 싶습니다.그러나 이 좋은 장소 수 있습한 폐쇄:

def spinner()
  state = ['|','/','-','\\']
  return proc { state.push(state.shift)[0] }
end

spin = spinner

# start working
print spin.call
# more work
print spin.call
# etc...

실제로 나는 이 솔루션을 수 있습니다 너무"똑똑한"에 대한 자신의 좋은,그러나의 아이디어를 이해 Procs 유용 할 수 있습니다.

다른 팁

내가 좋아하는 이러한 모든 제안,그러나 내가 생성기에서 표준 라이브러리,그리고 나는 그것이 더 많은 라인을 따라 내가 무엇을 하고 싶:

spinChar=Generator.new{ |g|
  ['|','/','-','\\'].cycle{ |x|
    g.yield x
  }
}
#then
spinChar.next
#will indefinitly output the next character.

일반 array index 단위로 계수기에 배열 될 것으로 보인다.

Vlad 의 실은 멋진하지만 정확히 무엇이었습니다.고서 spinner class 하나인 증가는 것이 좋은 경우 루비 지원 i++GLYPHS[@i++%GLYPHS.length]

Max 의 spinner closure 푸시 이동을 보인 작은 집중하는 나에게,그러나 결과는 구문가 거의 똑같이 생성기입니다.적어도 내가 생각하는 폐쇄적으로 proc 습니다.

척의 with_spinner 실제로 아주 가까 내가 원하는 것을,하지만 왜 끊이지 않는 경우가 있으로 발전기합니다.

바딤에 대한 감사리 generator 느린 것입니다.

"Here's a test of 50,000 spins:"
                   user       system     total       real
"array index"      0.050000   0.000000   0.050000 (  0.055520)
"spinner class"    0.100000   0.010000   0.110000 (  0.105594)
"spinner closure"  0.080000   0.030000   0.110000 (  0.116068)
"with_spinner"     0.070000   0.030000   0.100000 (  0.095915)
"generator"        6.710000   0.320000   7.030000 (  7.304569)

나는 생각을 했다 오른쪽에는 트랙 cycle.는 방법에 대해 이 같은 것:

1.8.7 :001 > spinner = ['|','/','-','\\'].cycle
 => #<Enumerable::Enumerator:0x7f111c165790> 
1.8.7 :002 > spinner.next
 => "|" 
1.8.7 :003 > spinner.next
 => "/" 
1.8.7 :004 > spinner.next
 => "-" 
1.8.7 :005 > spinner.next
 => "\\" 
1.8.7 :006 > spinner.next
 => "|" 

나는 생각하지 않을 확실히 이해하이 무엇 yield 는 루비에서.그것은 값을 반환하지 않은 구획에서—그것을 전달하는 가치 하기 블록 당신이 통과를 둘러싸는 방법입니다.

나는 당신이 원하는 무언가가 더 많은 다음과 같다:

def with_spinner
  a=['|','/','-','\\']
  a.cycle do |x|
    print x
    $stdout.flush # needed because standard out is usually buffered
    yield # this will call the do-block you pass to with_spinner
  end
end

with_spinner do
  #process here
  #break when done
end

Once upon a time,내가 쓴 훌륭한 기능들을 가지고 있습니다.하지만 그것은 단지 배열을,그것은 배열이 있는 포인터를 호출할 수 있도록 다음 과제하려고하니까!http://gist.github.com/55955

이 클래스는 단순 반복기 또는 반복하고 당신은 황금입니다.

 a = Collection.new(:a, :b, :c)
 1000.times do |i|
   puts a.current
   a.next
 end

코드 비트입니다 내부,경우에 당신은 용서 나에게 말하고 그래서.:)

왜:

class Spinner
  GLYPHS=['|','/','-','\\']
  def budge
    print "#{GLYPHS[@idx = ((@idx || 0) + 1) % GLYPHS.length]}\b"
  end
end

spinner = Spinner.new
spinner.budge
# do something
spinner.budge
spinner.budge
# do something else
spinner.budge

지금, 하려는 경우,다음과 같습니다.

with_spinner do
  # do my big task here
end

...다음할 사용 멀티-스레딩:

def with_spinner
  t = Thread.new do
    ['|','/','-','\\'].cycle { |c| print "#{c}\b" ; sleep(1) }
  end
  yield
  Thread.kill(t) # nasty but effective
end

다 대답은 위의 내 모든 더러운입니다.

a=['|','/','-','\\']
a << a
a.each {|item| puts item}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top