gpt4 book ai didi

java - java中的ruby block 相当于什么

转载 作者:行者123 更新时间:2023-12-02 01:07:58 25 4
gpt4 key购买 nike

Ruby block 可以方便地将一些代码包装在调用者定义的某些 block 周围。

如何在 Java 中执行此操作?

def myf(i)
puts "start"
yield i
puts "end"
end

myf(3){ |i| puts i * 10 }
myf(4){ |i| puts i - 10 }

# outputs:
# start
# 30
# end
# start
# -6
# end

最佳答案

How to do this in Java?

Java 中没有与 Ruby block 等效的东西。 Ruby block 在语法上是轻量级的,在语义上是轻量级的,而且它们不是对象。它们大多是句法结构,背后有一些轻量级语义。就这一点而言,它们更像是增强版for Java 中的循环。

Java 中最接近的等价物是 functional interfacelambda expression 结合。像这样,使用 java.util.function 中的预定义功能接口(interface)之一包,即接口(interface) java.util.function.Consumer<T> :

void myf(int i, java.util.function.Consumer<Integer> proc) {
System.out.println("start");
proc.accept(i);
System.out.println("end");
}

你可以像这样使用它:

myf(3, i -> System.out.println(i * 10));
myf(4, i -> System.out.println(i - 10));
// start
// 30
// end
// start
// -6
// end

但是,这等同于 Ruby 的 block 。这相当于 Ruby 的 Proc lambda literals ,换句话说,它更相当于这样:

def myf(i, proc)
puts "start"
proc.(i)
puts "end"
end

myf(3, -> i { puts i * 10 })
myf(4, -> i { puts i - 10 })

# start
# 30
# end
# start
# -6
# end

请注意myf在您的示例中不使用 block 的结果,因此使用 java.util.function.Function<T, R> 对其进行建模是不正确的。 Consumer<T>是用于“函数”(实际上更像是一个过程)的正确接口(interface),它“消耗”其参数但不返回任何内容,而 Function<T, R>是用于接受一个参数并返回结果的函数的正确接口(interface)。

关于java - java中的ruby block 相当于什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59104312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com