D2高尔夫技巧


10

您在D打高尔夫球有哪些一般秘诀?我正在寻找可以应用于编码高尔夫球问题的想法,这些想法至少在某种程度上特定于D(例如,“删除评论”不是答案)。请为每个答案发布一个提示。

Answers:


1

看,没有人!

D的函数和模板函数可以称为值,方法(无济于事)和属性。

我不敢相信还没有人这么说。我将列出那些保存字节的文件:

  • fun()fun!()()缩短为fun(假设没有变量fun)。
  • fun(par)缩短为par.fun(假设par没有属性/方法fun,并且par不是类似的表达式5+2)。
  • fun!(T)() 缩短为 fun!T
  • fun!(T)(par)缩短为par.fun!T(假设par没有属性/方法fun

和对象:

  • new cls()缩短为new cls(更多JavaScript吗?)
  • obj.fun()obj.fun!()()缩短为obj.fun
  • obj.fun!(T)() 缩短为 obj.fun!T

最后一件事,请使用旧版本。它允许您使用不赞成使用的功能,从而缩短了代码。就是说,最好的建议是:D不适用于代码高尔夫。这是一种很棒的语言,只是不适合于代码高尔夫球。


现在接受:)

是的,很高兴知道这里仍然有D的粉丝。
扎卡里

1

D是JavaScript。


明显不是。但是,随着打交道时floatdoublerealnan是必须处理的,并且,由IEEE 754指定的值不同,NaN不比较本身相等。

writeln(double.nan == double.nan); // false

含义,

writeln(value!=value); // only true for nan

比...短

import std.math;
writeln(isNaN(value));

显然,始终math.isNaN用于实际代码。;)


0

D具有类型推断和auto关键字。如果对象不是int,则auto可能会更短。


是否auto建立与一个关联数组工作时KeyType[ValueType]的语法?
Alex A.

@AlexA。auto asd = ["a":1, "b": 2];作品,但由于KeyType[ValueType]将在的地方去auto关键词,我不知道这是否会与该文字不能构造类型总是工作

@AlexA。auto arr = ["a": true, "b": 6];的作品,键和值必须是兼容的类型
2016年

0

D擅长方法链接,但是:

str.toLower.strip().split("").sort();

是相同的

sort(split(strip(str.toLower),""));

通常,非链式链的较短,这是我刚刚意识到的,这使我可以缩短对“ 管理垃圾箱”的回答:D


这就是那些点
CalculatorFeline

0

像C / C ++一样,main可以是intvoid,但void main(){}总是比短int main(){return my_func_returning_int;}


如果问题要求输出整数会不会int main(){return output}更短?
andlrc '16

@ dev-null如果问题要求一个完整的程序将一个整数写入stdout,那么import std.stdio;void main(){write(7);}这是需要的。我怀疑一个问题,将要求该程序返回一个数字,因为许多语言不能设置返回代码

@ DEV-空但是,是的,在这种情况下,它应该被写入到标准输出,但返回时,它会更短

2
通常,您被允许以最方便的方式返回/输出您的语言。但是我想D仅支持0-255的退出代码?
andlrc '16

@ dev-null实际上,POSIX仅支持最多255个退出代码。我不知道Windows,但是在Unix / Linux上,由于溢出,超过255个退出代码会回绕。

0

作为一种多范式(对象功能)系统编程语言,D似乎包含TIMTOWTDI,或者说有不止一种方法可以做到这一点。

举例来说,编写程序的argv:

import std.stdio, std.array, std.algorithm;

void main(string[] args) {
    for(int i=0;i<args.length;writeln(args[i++])){};

    foreach(a;args)writeln(a);

    each!writeln(args);
}

请注意{}在这种情况下,C样式的for循环require 作为空块,并且不接受分号或不接受任何内容作为空白语句。通常,还是;没有人。


可以char*代替string保存一个字节吗?
Alex A.

@AlexA。function D main parameters must be main() or main(string[] args)此外,它char是字面上的一个字符,char*是指向字面上的一个字符的指针,并且char[]是字符字面量的数组(字符串不同)。D!= C || C ++

1
OIC。从未使用过D,只是在猜测。
Alex A.

0

D有几种类型的C#样式的lambda表达式,可以将其分配并单独使用:

(int a,int b)=>a*b;

auto a=(int a,int b)=>a*b;

但是,与C#不同,仍然需要签名的类型,因为D没有Haskell级别的类型推断。

https://dlang.org/spec/expression.html#Lambda


高尔夫类型的功能模板?T f(T)(T a,T b){return a + b}应该推断牛逼INTf(5);
FEDE秒。

@fedes。你好朋友!是的,您是完全正确的(但我认为/希望“未键入”的lambda会短于键入函数的表达式)。

啊,ofc!当我决定对D进行另一番研究时,我会找到谁?:DI客观地宣布您对语言有良好的品味
fede s。

@fedes。噢,为什么谢谢你!:P暗示你也这样做(但我没有在Smalltalk前度过足够的时间,但反正:))

0

在没有其他参数的情况下在对象上调用函数

reverse(x);

几乎总是可以缩短为

x.reverse;

剃一个字节或更多。

这是因为.使得LHS成为隐式的第一个参数,而模板化使我们为args选择了正确的函数。


点好吗?这令人困惑……
CalculatorFeline

如果没有参数,则使用@CatsAreFluffy。当有另一种说法,x.reverse(y, z)是长点的,因为

1
x.reverse(y,z)reverse(x,y,z)具有相同的字节数
扎卡里

@ZacharyT恩,是的...

是你比较x.reverse(y, z)x.reverse
扎卡里

0

如果问题需要完整的程序,则module声明是不必要的。

*咳嗽* Java,有人吗?*清除喉咙* 实际上,D的module系统早于Java的系统。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.