From: "Jesús Gabriel y Galán" Date: 2009-01-29T01:01:37+09:00 Subject: Re: function inside a function On Wed, Jan 28, 2009 at 4:49 PM, Jason Lillywhite wrote: > I have a question about the timing of function evaluations in this case: > > def function_a(x = 1) > x**2 + x > end > > def function_b(any_function) > y = 4 + 5 #this would actually be more complex > function_a(y) > end > > puts function_b(function_a) > > I found that function_a(x = 1) is evaluated first, then > function_b(function_a). I found that 'def function_a(x = nil) returns an > error. Why does function_a need to be evaluated before it is called as > an argument in function_b? The problem here is that when you write function_a, this is actually *calling* function_a,which as you are not supplying any parameter uses the default value of 1 you defined. > PS - the reason I am writing things this way is to make function_b > accept any function (within reason). For sure there are many ways to achieve this, but a common way is to use blocks and lambdas: function_a = lambda {|x| x**2 + x} def function_b y = 4 + 5 #this would actually be more complex yield y end or more explicitly: def function_b (&blk) y = 4 + 5 blk.call(y) # or blk[y] end puts function_b(&function_a) Hope this helps, Jesus.