【问题标题】:Delphi Boolean Return Function Hint: Value assigned to '' never used?Delphi 布尔返回函数提示:分配给 '' 的值从未使用过?
【发布时间】:2013-10-08 07:58:00
【问题描述】:

我有

playerIds : Array[0..500] of string;

function isPlayerMob(check : string): boolean;
var
    i : integer;
begin
    for i := 0 to 500 do
    begin
        if ((playerIds[i] <> '') and (playerIds[i] = check)) then
        begin
            result := true;
        end;
    end;
    result := false;
end;

我收到警告

Hint: Value assigned to 'isPlayerMob' never used

谁能告诉我如何解决这个问题? 错误是针对

结果 := true;

【问题讨论】:

    标签: arrays delphi function boolean


    【解决方案1】:

    此提示是因为您总是将 false 值分配给函数。无论是否在循环中找到该值。

    试试这个

    function isPlayerMob(const check : string): boolean;
    var
        i : integer;
    begin
        result := false;
        for i := 0 to 500 do
            if ((playerIds[i] <> '') and (playerIds[i] = check)) then
            begin
              result := true;
              break;
            end;
    end;
    

    【讨论】:

    • 谢谢 我正在考虑在中间使用Exit; 命令,这似乎更好。
    • 在这种特定情况中,breakexit 将以相同的方式工作。 Aslo取决于你的delphi版本,你可以写if ((playerIds[i] &lt;&gt; '') and (playerIds[i] = check)) then exit(true);
    • 这里的退出要好得多。使用 break 你想知道这个函数还能做什么。这是一个不修改状态的函数,其唯一任务是评估结果。一旦明确设置了结果,它应该退出。
    • 一个真正好的解决方案是使用带有适当退出条件的whilerepeat..until 循环。 (有点像while ((i &lt;= 500) and (not Result))。在这种情况下,迭代器当然必须手动递增。)
    • @mg30rg 阅读起来并不容易。还有更多,还有更多的分支和逻辑要解析。即使经过多年的经验,也没有人发现while ((i &lt;= 500) and (not Result)) 解析起来很简单。每个人都必须仔细考虑。那是因为它有分支和逻辑。你必须想,“应该是and 还是应该是or。你必须想“应该有not,还是应该没有”。
    【解决方案2】:

    您编写的函数将始终执行最后的Result := false; 行,因此循环内分配的值将始终被丢弃。

    改为更改您的函数以首先初始化结果:

    function isPlayerMob(check : string): boolean;
    var
        i : integer;
    begin
      Result := false;
      for i := 0 to 500 do
      begin
        if ((playerIds[i] <> '') and (playerIds[i] = check)) then
        begin
          Result := true;
          Exit;
        end;
      end;
    end;
    

    在 Delphi 2009 及更高版本中,Result := True; Exit; 行可以简单地替换为 Exit(True);

    【讨论】:

    • 谢谢,我以为 Result 会自动返回。
    • 如果你想立即退出函数并返回结果,你可以使用Exit(value),在你的情况下Exit(TRUE)Exit(FALSE)
    • @MarkoPaunovic 确实如此,但取决于 Delphi 版本。
    • 是的。你知道Exit(value)是什么时候介绍的吗?
    • 可选的Exit 参数是在Delphi 2009 中引入的。
    【解决方案3】:

    正如其他人告诉您的那样,您的循环分配给Result 的值将被丢弃,因为在最终分配给Result 之前您没有退出函数,因此循环分配的内容无关紧要。

    您可以为 Result 分配一个初始值,然后根据需要重新分配它,或者您可以在分配所需值后简单地 Exit

    function isPlayerMob(check : string): boolean;
    var
      i : integer;
    begin
      for i := 0 to 500 do
      begin
        if ((playerIds[i] <> '') and (playerIds[i] = check)) then
        begin
          Result := True;
          Exit; // <-- add this
        end;
      end;
      Result := False; // <-- only performed if the loop does not find a match
    end;
    

    或者,如果您使用的是最新的 Delphi 版本:

    function isPlayerMob(check : string): boolean;
    var
      i : integer;
    begin
      for i := 0 to 500 do
      begin
        if ((playerIds[i] <> '') and (playerIds[i] = check)) then
          Exit(True); // <-- sets Result and exits at the same time
      end;
      Result := False; // <-- only performed if the loop does not find a match
    end;
    

    【讨论】:

      猜你喜欢
      • 2012-06-16
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 2017-06-07
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多