From: E S Date: 2005-02-13T09:19:36+09:00 Subject: Re: difficulty with blocks > L�hett�j�: Johannes Ahl-mann > Aihe: Re: difficulty with blocks > > hi, > > sorry for answering my own post, but i am adopting ruby at an incredible > rate. i know python quite well and it took me literally mere minutes to > get the BASIC hang of blocks... i've been programming in ruby for 3 > hours now and it already feels like home! not much cosier than python, > but the block closures and the possibility of continuations drags me > into ruby nonetheless ;-) > > well, i've got a rather satisfactory solution to my problem and would now like > to ask whether my implementation can be considered "the ruby way" or if it > feels rather strange to the senior rubiists (i.e. people who have > programmed in ruby for more than 3 hours) *ggg* > > > ### snip ### > > > def fib_block &block > a, b = 1, 1 > while true: > block.call(a) > a, b = b, a+b > end > end > > require 'generator' > def fibUpTo n, &block > fibs = Generator.new do |g| > fib_block {|val| g.yield val} > end > > while (f = fibs.next()) < n > block.call(f) > end > end > > def into(anArray) > return proc {|val| anArray << val} > end > fibUpTo 20, &into(a = []) > puts a > > > ### snip ### > > thx and forgive me for answering my own questions. i really shouldn't do > that ;-)) That works fine, but let me ask you what you're trying to do? There're certainly much more natural ways to get a Fibonacci abstracted in Ruby -and this is not said maliciously in any way; it'd just be a lot easier to advise if we knew the goal, which I assume may not be abstracting the FibSeq but to work out a certain idiom? :) > Johannes > > P.S.: what is it with the implicit blocks in ruby. i am aware that many > people seem not to be explicitely passing the block into a function, but > i really find that distracting and too much of a perl idiom. is my way > alright, or was it unidiomatic?? It's just shorter to write. > P.P.S: is there a better way to write "fib_block {|val| g.yield val}"? > maybe something like "fib_block.apply(g.yield)" or so. i guess not, but > the repetition bothers me! E