定制卷曲支架方法

时间:2014-12-11 10:00:46

标签: java curly-brackets

在java中,一些标准库方法(也许它们实际上不是方法?)具有以下格式:

keyword(condition or statements) {
//write your code here
}

这包括if语句,for-loop,while-loop do-while-loop等。

for(initialValue = n; conditionForLoopToContinue; incrementOrDecrement) {
//write your code
}

你也可以像这样开始匿名线程:

new Thread() {
//write your code here
}.start();

我想知道的是我们可以创建我们自己的方法(或者实际上被称为它们的任何方法)吗?

所以,例如,我会写一个'until'方法,如下所示:

int a = 0;
until(a == 10) {
a++;
}

其中(a == 10)等于while(a!= 10)。

当然,上面的例子不允许我们做任何新的事情(我们可以只使用while循环),但这个问题的目的是找出我们是否可以编写'自定义大括号方法'。

此外,如果你们知道任何具有此功能或类似功能的语言,请告知我们。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

您无法实施自己的关键字。您当然可以创建自己类的匿名子类,即可以

new YourOwnClass() {
    // write your code here
}.launch();

如果你愿意的话。

使用Java 8,您可以进一步了解您要求的大括号语法。这是我尝试使用lambdas模仿你的util方法:

public class Scratch {

    static int a;

    public static void until(Supplier<Boolean> condition, Runnable code) {
        while (!condition.get())
            code.run();
    }

    public static void main(String[] args) {
        a = 0;
        until(() -> a == 10, () -> {
            System.out.println(a);
            a++;
        });
    }
}

<强>输出:

0
1
2
3
4
5
6
7
8
9

请注意,在这个略显人为的例子中存在一些限制。例如a由于闭包而需要是字段或常量变量。

答案 1 :(得分:0)

你正在做的事情是扩展语言,即发明一个新的&#34;保留词&#34;并且说这个保留字必须后跟一个布尔表达式和一个语句(块)。

仅需要新保留字的事实可能会导致很多问题,例如:人们可能已经在今天使用了until这个词。一个变量。您的新功能会破坏该代码。

此外,您还需要告诉运行时环境新语句的效果是什么。

我不知道您可以简单地执行此操作的语言。就像@aioobe所说的那样,lambdas可能会变得非常接近。

答案 2 :(得分:0)

不像aioobe那样优雅:

abstract class until<T> {
    // An attempt at an `until` construct.

    // The value.
    final T value;
    // The test.
    final Function<T, Boolean> test;

    public until(T v, Function<T, Boolean> test) {
        this.value = v;
        this.test = test;
    }

    public void loop() {
        while (!test.apply(value)) {
            step();
        }
    }

    abstract void step();
}

public void test() {
    AtomicInteger a = new AtomicInteger();
    new until<AtomicInteger>(a, x -> x.get() == 10) {

        @Override
        void step() {
            a.getAndIncrement();
        }

    }.loop();
    System.out.println("a=" + a);
}

可能会有一些改进。

就其他语言而言。

C中 - 如果我没记错的话 - 你可以这样做:

#define until(e) while(!(e))

并在BCPL中有一整套条件WHILEUNTILIFUNLESS等。