小编fwe*_*end的帖子

编译时间评估

如果我写

enum chars = digits ~ uppercase;
Run Code Online (Sandbox Code Playgroud)

字符串是否会在编译时连接?我假设它会.如果我用字符串文字或CTFE函数替换它,我无法测量任何显着的性能差异(甚至称它为一亿次).如果我用const替换enum,我确实会有所不同.我被告知这样编写效率很低.我觉得这很方便,我看不出效率低下.(顺便说一句,该行是一个递归调用的函数).

完整代码(转换为具有不同基数的数字系统)

import std.string;

string toBase(long n, int b) 
in {
    assert(2 <= b && b <= 35);
} body {
    static string sign;
    if (n < 0) {
        n *= -1;
        sign = "-";
    }
    enum chars = digits ~ uppercase;
    size_t r = cast(size_t)(n % b);
    if (n == r) {
        return sign ~ chars[r];
    }
    return toBase((n - r) / b, b) ~ chars[r];
}
Run Code Online (Sandbox Code Playgroud)

编辑:更新的代码,以回应评论,与问题无关

string toBase(long n, int …
Run Code Online (Sandbox Code Playgroud)

d compile-time

12
推荐指数
2
解决办法
496
查看次数

比较器比较

我需要对点列表进行排序.首先,我需要比较x值,然后如果x值相等,则y值.所以我以为我会使用thenComparing方法:

Comparator<Point> cmp = Comparator.comparingInt(p -> p.x).thenComparingInt(p -> p.y);
Run Code Online (Sandbox Code Playgroud)

但我一直收到消息:不兼容的类型:Comparator <Object>无法转换为Comparator <Point>.

还有其他方法我可以进行这种比较,它有效,但我不明白我在这里做错了什么.

java

9
推荐指数
1
解决办法
2万
查看次数

如果签名jar(带有时间戳)的证书过期,会发生什么

我在2年前签了一个带有时间戳的jar(小程序).证书即将到期.会发生什么?是否会向用户发出警告,它是否会起作用?它会停止工作吗?

我没有向applet添加任何特定代码来处理时间戳.签名时我只包含-tsa网址.

编辑:它继续工作.

java jar-signing

8
推荐指数
1
解决办法
2466
查看次数

D2:std.algorithm.indexOf不再起作用了

我在rosettacode.org上发布了以下代码,用于转换阿拉伯数字和罗马数字的任务.

import std.regex, std.array, std.algorithm;

immutable {
    int[] weights = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
    string[] symbols = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", 
                        "V", "IV", "I"];
}

string toRoman(int n) {
    auto app = appender!string;
    foreach (i, w; weights) {
        while (n >= w) {
            app.put(symbols[i]);
            n -= w;
        }
        if (n == 0) break;
    }
    return app.data;
}

int toArabic(string s) {
    int arabic; …
Run Code Online (Sandbox Code Playgroud)

d

7
推荐指数
1
解决办法
277
查看次数

D2:在运行时设置数组维度

当你在编译时还不知道它时,如何设置数组的维度?

例如:byte [] [] a =新字节[size] [size]; 编译器不允许它.我该如何初始化网格?手动?

byte[] a1;
for (int i; i < size; i++) {
     a1 ~= 0;
} 
byte[][] a2; 
for (int i; i < size; i++) {
     a2 ~= a1;
} 
Run Code Online (Sandbox Code Playgroud)

请告诉我有一个更简单的方法.

编辑:这也有效,但它仍然无可救药地原始,而且很慢

byte[][] a3; 
a3.length = size;
for (int i; i < size; i++) {
     a3[i].length = size;
} 
Run Code Online (Sandbox Code Playgroud)

d

6
推荐指数
1
解决办法
296
查看次数

在类和结构之间进行选择

关于C#的msdn文章命名为在类和结构之间选择,给出了以下建议:

如果类型的实例很小并且通常是短暂的或者通常嵌入在其他对象中,则考虑定义结构而不是类.

除非类型具有以下所有特征,否则不要定义结构:

It logically represents a single value, similar to primitive types
Run Code Online (Sandbox Code Playgroud)

(整数,双精度等).

It has an instance size smaller than 16 bytes.

It is immutable.

It will not have to be boxed frequently. 
Run Code Online (Sandbox Code Playgroud)

如果不满足这些条件中的一个或多个,请创建引用类型而不是结构.不遵守本指南可能会对性能产生负面影响.

我想知道在D的情况下答案是什么.到目前为止,我只是在我不需要多态的情况下使用结构.我不知道尺寸是否也是一个考虑因素.或其他任何东西.

polymorphism struct d class

6
推荐指数
2
解决办法
428
查看次数

为什么std.algorithm.fill不接受字符数组?

如果我尝试使用std.algorithm.fill(Range1,Range2)(Range1范围,Range2填充),我会不断收到错误消息,表明找不到模板匹配.看起来编译器试图匹配fill(Range,Value)而不是另一个.

auto test = new char[256];
fill(test, "abc".dup);
Run Code Online (Sandbox Code Playgroud)

是否无法使用填充填充字符数组?

错误

test.d(13):错误:模板std.algorithm.fill(Range,Value)if(isForwardRange!(Range)&&是(typeof(range.front = filler)))与任何函数模板声明都不匹配

test.d(13):错误:模板std.algorithm.fill(Range,Value)if(isForwardRange!(Range)&&是(typeof(range.front = filler)))不能从参数类型推导出emplate函数!( )(炭[],CHAR [])

d

5
推荐指数
1
解决办法
328
查看次数

为什么要检查Match.Success

在代码示例中,我看到一个foreach循环遍历a 的匹配regex.在循环内有一个检查match.Success.但是这些比赛都不会成功吗?否则他们不会匹配,不是吗?

我认为(在这种情况下)检查是多余的是错误的吗?

var regex = new Regex(pattern);
var matches = regex.Matches(input);
var list = new List<string>();
foreach (Match m in matches) {
    if (m.Success) {
        list.Add(m.Value);
    }
}
Run Code Online (Sandbox Code Playgroud)

c# regex

5
推荐指数
1
解决办法
420
查看次数

有静态数组有什么意义呢

我没有C或C++的背景,所以静态数组让我有点困惑.它们适用于什么?为什么他们分配在堆栈上?

我想有一个性能优势.堆栈分配更快,不需要垃圾回收.但为什么在编译时需要知道长度?难道你不能在运行时创建一个固定大小的数组并在堆栈上分配它?

D中的动态数组或切片由包含指针和长度属性的结构表示.静态数组是一样的吗?他们是如何代表的?

如果将它们传递给函数,它们将被完整复制(除非你使用ref),这背后的基本原理是什么?

我意识到动态数组和切片在D中比静态数组更加重要,这就是为什么文档没有详细讨论它们,但我仍然希望有更多的背景知识.我想静态数组的特性与堆栈分配的工作方式有关.

d static-array

4
推荐指数
2
解决办法
392
查看次数

D2:条件语句中的空字符串

在下面的代码中,为什么2给出输出但不给出3?removechars语句返回长度为0的字符串

import std.stdio, std.string;

void main() {
    string str = null;
    if (str) writeln(1); // no

    str = "";
    if (str) writeln(2); // yes

    if (",&%$".removechars(r"^a-z"))  writeln(3); // no
}
Run Code Online (Sandbox Code Playgroud)

编辑:好吧,它可能会返回null,但我仍然有点困惑,因为所有这些打印都是真的

writeln(",&%$".removechars(r"^a-z") == "");
writeln(",&%$".removechars(r"^a-z") == null);
writeln(",&%$".removechars(r"^a-z").length == 0);
Run Code Online (Sandbox Code Playgroud)

编辑2:这也打印为true,但是将它们中的任何一个置于条件中并获得不同的结果

writeln("" == null);
Run Code Online (Sandbox Code Playgroud)

编辑3:好吧,我明白我不能像我那样测试空字符串.导致这个问题的是以下情况.我想从单词中删除字符,但不想存储空字符串:

if (auto w = word.removechars(r"^a-z"))
    wordcount[w]++;
Run Code Online (Sandbox Code Playgroud)

这在我尝试时有效,但这必须是因为removechars返回null而不是""

d

3
推荐指数
1
解决办法
212
查看次数

标签 统计

d ×7

java ×2

c# ×1

class ×1

compile-time ×1

jar-signing ×1

polymorphism ×1

regex ×1

static-array ×1

struct ×1