我在试着用普鲁士和红宝石来理解蓝宝石。以下是一些代码:
puts -> x { -> y {x.call(y) } }
# => #<Proc:0x2a3beb0@C:/first-ruby.rb:1 (lambda)>
puts -> x { x + 2}.call(1)
# => 3在上面的例子中,->意味着什么?call方法是否将值传递给调用方,因此在第一个示例中,值y传递给y,在第二个示例中,1传递给x?在第二个示例中,为什么要将1计算为x
发布于 2013-08-12 22:53:31
在上面的例子中,
->意味着什么?
->是lambdas文字语法的一部分,就像'是字符串字面语法的一部分一样。
.call方法只是将值从调用方传递给调用方,
call方法是调用(或执行) lambda的方法。call方法的参数绑定到lambda的参数。
因此,在第一个示例中,
y值传递给y,在第二个示例中,1传递给x。
不是,在第一个示例中,y被传递给外部lambda并绑定到它的x参数。在第二个示例中,1被传递给lambda并绑定到它的x参数。
在第二个例子中,为什么
1是如何计算为x的?
1不评估x。1是一个即时值,在Ruby中,即时值总是对自己进行评估。1将始终评估为1,而不是x或其他任何东西。
发布于 2013-08-12 22:54:01
这是纯lambda表达式的快捷方式:
lmbd = -> arg{ something to do with arg } # With ->{} notation
lmbd = lambda { |arg| something to do with arg } # Standard notation在第一个示例中,使用Proc(lambda)对象调用puts方法,这就是在输出中看到#<Proc:0x2a3beb0@C:/first-ruby.rb:1 (lambda)>的原因。
在第二个示例中,使用lmbd.call(1)方法调用puts,即puts输出lambda计算的结果。
因此,如果您有lmbd变量,它是lambda对象,您可以像传递任何参数一样传递它,然后通过调用lmbd.call()获得结果
lmbd = -> greeting{ puts "#{greeting}, lambda-expression!" }
def say_hello l, text
l.call(text)
end
say_hello lmbd, "Aloha" # => Aloha, lambda-expression!发布于 2015-11-05 15:45:54
让我们使用Ruby定义一个函数。
def plus_two # no args here
->(x) {x + 2} # args go here
end
# assign a value
x = 1
# call it
plus_two.call(x)
# => 3您的第一个例子比较复杂,但是使用这个想法,您应该能够想出一些功能方法。我正在学习Scala,函数式编程是基于这些替代原则的。
尝试使用这些方法进行一些递归。这就像多次调用函数的函数。那么最基本的情况是什么?
至于Lambda微积分https://github.com/mackorone/lambda/blob/master/intro.pdf
尽量保持简单,并显示步骤,而不是试图找出一个班轮在做什么。是的,它们很好,但是如果你看不懂,你就听不懂。
下面是我最近正在做的事情:
require 'date'
num = DateTime.now.to_time.utc.to_datetime.ajd - 2451545.0
@t = num / 36525.0
# the terms in reverse order form for the array
@l0_a = [1.0/-19880000.0,
1.0/-152990.0,
1.0/499310.0,
0.0003032028,
36000.76982779,
280.4664567]
# make an enumerator
@l0_e = @l0_a.each
# make a lambda to pass the enumerator to.
def my_lambda
->(x) {x.reduce {|acc, el| acc * @t + el} % 360}
end
puts my_lambda.call(@l0_e)这是使用枚举器方法的太阳公式的平均经度,当然还有一个lambda。
https://stackoverflow.com/questions/18197345
复制相似问题