Почему Сам является присваиваемым в Delphi?

Если я правильно понял ваш вопрос, версия Swift продиктована Podspec .

Более подробно, это выглядело бы так:

Pod::Spec.new do |spec|
  ...
  spec.swift_version = '4.2'
  ...
end

Я предполагаю, что если это не учитывать, то в настоящее время по умолчанию используется значение 4.0.

Если вы хотите углубиться в детали, проверьте источник :

# @return [String] the Swift version for the target. If the pod author has provided a set of Swift versions
#         supported by their pod then the max Swift version across all of target definitions is chosen, unless
#         a target definition specifies explicit requirements for supported Swift versions. Otherwise the Swift
#         version is derived by the target definitions that integrate this pod as long as they are the same.
#
def swift_version
  @swift_version ||= begin
    if spec_swift_versions.empty?
      target_definitions.map(&:swift_version).compact.uniq.first
    else
      spec_swift_versions.sort.reverse_each.find do |swift_version|
        target_definitions.all? do |td|
          td.supports_swift_version?(swift_version)
        end
      end.to_s
    end
  end
end

17
задан Bruce McGee 6 April 2010 в 16:03
поделиться

5 ответов

Это не так плохо, как могло бы быть. Я только что протестировал его в Delphi 2009, и мне показалось, что, хотя параметр Self не использует семантику const , как вы, кажется, подразумеваете, что он должен, он также не использует var семантика, поэтому вы можете изменить ее все, что захотите, в своем методе, не теряя при этом ссылку, которую вызывающий объект имеет на ваш объект. Это было бы очень плохо.

Что касается причины, то один из двух ответов. Либо простая оплошность, либо то, что предложил Марко: позволить вам передать Self в параметр var .

11
ответ дан 30 November 2019 в 13:13
поделиться

Присвоение Себя настолько нелогично и бесполезно, что эта «особенность» это, вероятно, недосмотр. Как и в случае с присваиваемыми константами, такие проблемы не всегда легко исправить.

Здесь простой совет: не делайте этого.

4
ответ дан 30 November 2019 в 13:13
поделиться

Может быть, разрешить переход к параметрам const или var?

Это может быть артефакт, поскольку в системе нет «я» слева от знака: =.

7
ответ дан 30 November 2019 в 13:13
поделиться

На самом деле «Self» - это просто ссылка на имя места в стеке, в котором хранится адрес, указывающий на объект в куче. Возможно принудительное использование этой переменной только для чтения, видимо, дизайнер решил этого не делать. Я считаю, что решение произвольное.

Не вижу случая, когда это было бы полезно, это просто изменило бы значение в стеке. Кроме того, изменение этого значения может быть опасным, так как нет гарантии, что поведение кода этого элемента ссылочного экземпляра будет согласованным между версиями компилятора.

Обновлено: В ответ на PatrickvL comment

"Переменная" "Я" отсутствует в стек (насколько мне известно, его никогда не было); Вместо этого значение помещается в зарегистрироваться (EAX, если быть точным) непосредственно перед выполняется вызов любого метода объекта. -

Нет, у Self есть фактический адрес в памяти. Попробуйте этот код, чтобы убедиться в этом сами.

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(Integer(@Self)));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  newform: TForm;
  p: ^Integer;
begin
  Self.Caption := 'TheOriginal';
  newform := TForm.Create(nil);
  try
    newform.Caption := 'TheNewOne';
    // The following two lines is, technically, the same as
    //   Self := newform;
    p := Pointer(@Self);
    p^ := Integer(newform);
    ShowMessage(Self.Caption);  // This will show 'TheNewOne' instead of 'TheOriginal'
  finally
    Self.Free; // Relax, this will free TheNewOne rather than TheOriginal
  end;
end;
2
ответ дан 30 November 2019 в 13:13
поделиться

Иногда, когда вы хотите оптимизировать метод, насколько это возможно (не прибегая к сборке), «Self» можно (ab) использовать как «бесплатную» переменную - это может просто означать разницу между используя стек и используя регистры.

Конечно, содержимое стека, скорее всего, уже присутствует в кэше ЦП, поэтому доступ к нему должен быть быстрым, но регистры еще быстрее.

В качестве примечания: я все еще скучаю по дням, когда я программировал на Motorola 68000 от Amiga и имел роскошь 16 данных и 16 адресных регистров ... Я не могу поверить, что мир решил пойти с ограничено 4 регистрами линейки процессоров 80x86!

И в заключение, я иногда предпочитаю использовать Self, поскольку оптимизатор Delphi, ну, на самом деле, не так хорошо оптимизирует . (По крайней мере, это меркнет по сравнению с тем, что можно найти, например, в различных оптимизаторах LLVM.) ИМХО, и, конечно, YMMV.

1
ответ дан 30 November 2019 в 13:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: