小编Max*_*Max的帖子

为接口变量或参数分配匿名方法?

匿名方法本质上interface是一个Invoke方法:

type
  TProc = reference to procedure;

  IProc = interface
    procedure Invoke;
  end;
Run Code Online (Sandbox Code Playgroud)

现在,是否有可能将它们分配给实际的接口变量或将它们作为接口参数传递?

procedure TakeInterface(const Value: IInterface);
begin
end;

var
  P: TProc;
  I: IInterface;
begin
  I := P; // E2010
  TakeInterface(P); // E2010
end;
Run Code Online (Sandbox Code Playgroud)

[DCC32错误] E2010不兼容的类型:'IInterface'和'过程,无类型指针或无类型参数'

问题:这个用例是什么?

有很多对象,不能通过接口引用保持活着.因此,它们被包裹在一个封闭物中并被它摧毁,"智能指针":

type
  I<T> = reference to function : T;

  TInterfaced<T: class> = class (TInterfacedObject, I<T>)
  strict private
    FValue: T;
    function Invoke: T; // Result := FValue;
  public
    constructor Create(const Value: T); // FValue := Value;
    destructor …
Run Code Online (Sandbox Code Playgroud)

delphi closures anonymous-methods

13
推荐指数
2
解决办法
2053
查看次数

Exception.RaiseOuterException 与 W1035 函数“%s”的返回值可能未定义

这已经被报告为RSP-25603: "Exception.RaiseOuterException can cause wrong W1035 warning"


鉴于以下(演示)函数F,我已将异常引发语句更改为现在链异常:

--- before
+++ after
@@ -1,11 +1,11 @@
 function F(X: NativeInt): NativeInt;
 begin
   try
     Result := 1 div X;
   except
     on EDivByZero do
-      {ECustom}Exception.Create('...');
+      Exception.RaiseOuterException({ECustom}Exception.Create('...'));
     else
       raise;
   end;
 end;
Run Code Online (Sandbox Code Playgroud)

现在,Ctrl-F9给出警告W1035

[dcc32 警告]:W1035 函数“F”的返回值可能未定义

但是,所有情况都会处理。编译器无法将其识别Exception.RaiseOuterExceptionraise操作。

不幸的FAcquireInnerException: Boolean是,Exception该类是私有的,甚至不能True在派生的自定义类中设置,我可以继续直接提高 ( raise ECustomException.Create)。

有什么方法可以让编译器理解,同时保持异常链接?不然我能想到{$Warn No_RetVal Off}。我还能如何解决这个警告?

delphi

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

我得到RTTIMethod.Visibility = mvPublic用于私有记录方法. - 虫子?

RTTIMethod.Visibility = mvPublic使用Delphi 10.2 获得(严格)私有记录方法.这是一个错误吗?


更新2017-07-12:创建的问题:RSP-18587.


程序输出显示记录和类的所有实例成员类型和可见性; 从RTTI返回的可见性; 看看对PrivateProcedureTSomeRec:

Types:
  Unit1.TSomeRec
    Fields:
      PrivateField
        Visibility: mvPrivate
      PublicField
        Visibility: mvPublic
    Properties:
    Methods:
      PrivateProcedure
        Visibility: mvPublic
      PrivateFunction
        Visibility: mvPublic
      PublicProcedure
        Visibility: mvPublic
      PublicFunction
        Visibility: mvPublic
  Unit1.TSomeClass
    Fields:
      PrivateField
        Visibility: mvPrivate
      ProtectedField
        Visibility: mvProtected
      PublicField
        Visibility: mvPublic
    Properties:
      PrivateProperty
        Visibility: mvPrivate
      ProtectedProperty
        Visibility: mvProtected
      PublicProperty
        Visibility: mvPublic
      PublishedProperty
        Visibility: mvPublished
    Methods:
      PrivateProcedure
        Visibility: mvPrivate
      PrivateFunction
        Visibility: mvPrivate
      ProtectedProcedure
        Visibility: mvProtected
      ProtectedFunction
        Visibility: mvProtected
      PublicProcedure
        Visibility: mvPublic …
Run Code Online (Sandbox Code Playgroud)

delphi rtti

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

System.RegularExpressions.TRegEx 线程安全吗?

背景:我遇到的一个应用程序TRegEx在多个线程中使用了一个单例。单例TRegEx.Create(Pattern, [roCompiled])在类构造函数中被初始化,线程使用它从 开始RegEx.Match(Value).Groups,并且似乎没有采用同步机制,但是,应用程序运行良好。尽管如此,这只是TThread.Execute覆盖的一小部分,并且线程上的负载很小。因此,这可能总是偶然地起作用,因为线程不太可能在关键部分相互交叉。

想法:一方面,考虑一下,一个TRegEx实例只包含一个不可变(编译)模式并直接处理参数输入是有道理的,或者将此输入保留在 ( TMatch) 返回值中以供以后可能的继续- - 例如 with NextMatch,它是在 上TMatch而不是在 上实现的TRegEx。并且底层的开源 PCRE 库似乎是线程安全的。所有这些都符合上面的场景。另一方面,我认为一个TRegEx实例通常不是线程安全的,因为例如,在function TRegEx.Match(const Input: String): TMatch(如上所用)中,看起来要与模式匹配的字符串在匹配之前首先存储到实例中。和相同的嵌套TPerlRegEx实例在各种功能链中传递并保持活动状态。TRegEx例如,共享实例似乎需要防止不协调的访问,例如使用临界区。

也就是说,我怀疑TRegEx不是线程安全的,但我想请教多线程和裁定线程安全的人进行确认。因此,我的问题 - 非常笼统,独立于它演变而来的应用程序:

问题:TRegEx 线程安全吗?

regex delphi multithreading pcre thread-safety

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

空字符串是有效的 YAML 文档吗?

  • 我有一个库在加载空字符串('')时不返回任何文档,我想知道这是否是一个错误。
  • 我无法从YAML 1.2 规范中推断出(最近提出这个问题)推断空字符串是否是有效的 YAML 文档。
  • 各种(在线)YAML 验证器需要至少一个字符才能显示结果,例如YAMLValidator.comOnlineYAMLTools.com
  • YAMLLint.com接受空字符串作为输入,但在验证时将输入文本更改为--- false,从而引发了空字符串是否实际上是输入的问题。

那么,一般来说,空字符串是有效的 YAML 文档吗?

yaml

4
推荐指数
1
解决办法
4575
查看次数

实例与方法作为参数——理解生命周期和垃圾收集

在一个人为的示例中,我有一个支持以下接口的实例:

public interface ISelector<L, R>
{
    R Select(L value);
}
Run Code Online (Sandbox Code Playgroud)

现在,我考虑两种调用方式IEnumerable.Select<L, R>(Func<L, R>)

IEnumerable<L> l;
ISelector<L, R> selector;
IEnumerable<R> r;
r = l.Select(v => selector.Select(v)); // 1
r = l.Select(selector.Select); // 2
Run Code Online (Sandbox Code Playgroud)

方式 1 将变量对选择器的引用捕获到闭包中,并且该闭包将独立于变量的范围来保存该引用selector。因此,变量selector可能会超出范围,并且可能会在变量超出范围r.ToList()后被调用。selector

但是,我不确定如何理解方式2:如何ISelector<L, R>.Select分配和捕获?变量是否可以selector超出范围并可以在变量超出范围r.ToList()后被调用?selector

就可读性而言,我更喜欢方法 2,但在使用它之前,我想首先了解捕获和垃圾收集部分的生命周期。

c# garbage-collection

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