Почему метод с & ldquo; значение приемника & rdquo; работать с & ldquo; указатель caller & rdquo ;? [Дубликат]

Это автономное решение:

$(window).load(function() {
  $('img').each(function() {
    if (!this.complete || typeof this.naturalWidth == "undefined" || this.naturalWidth == 0) {
      // image was broken, replace with your new image
      this.src = 'http://www.tranism.com/weblog/images/broken_ipod.gif';
    }
  });
});
4
задан sjakobi 1 August 2013 в 15:24
поделиться

2 ответа

Он не «получает» значение. Go строго типизирован, поэтому, если предписывается указатель на T, указатель на T (*T) является единственной опцией, которая может случиться как значение для такого типизированного места.

«Магия» находится в компиляторе, который эффективно «переписывает» ваш код в определенных условиях :

Вызов метода x.m() действителен, если набор методов (тип) x содержит m, а список аргументов может быть назначен списку параметров m. Если x адресуется, а набор методов & amp; x содержит m, x.m() является сокращением для (&x).m():

Связано: Наборы методов

8
ответ дан zzzz 19 August 2018 в 15:14
поделиться
  • 1
    Итак, пока v не является указателем в моем случае. Scale может просто относиться к нему так, как если бы он был одним? – sjakobi 1 August 2013 в 15:56
  • 2
    Нет, Scale не может рассматривать указатель не указателя как указателя. Выдержки из отрывков в ответе объясняют, почему Scale получит &v в качестве приемника, не v. – zzzz 1 August 2013 в 16:05
  • 3
    ОК. Но I может применять методы указателей к значениям так же, как если бы они были указателями. Спасибо, что объяснили это! – sjakobi 1 August 2013 в 16:08
  • 4
    Учтите, что эти значения должны быть адресуемыми. Например, вы не можете использовать литерал. – zk82 5 August 2013 в 14:49

Разница, которую предлагает тур, фактически не изменяет v := &Vertex{3, 4} на v:= Vertex{3, 4}, а скорее изменяет определения этих двух методов, чтобы они работали над значениями вместо указателей. Так, например, для Scale, func (v *Vertex) Scale(f float64) {... становится func (v Vertex) Scale(f float64) {... (обратите внимание, что (v *Vertex), значение указателя, становится (v Vertex), значением без указателя). В обоих случаях вы должны оставить объявление v как v := &Vertex{3, 4}.

Вы заметите, что в первом случае, когда методы принимают указатели, вывод будет &{15 20} 25. Однако, когда методы принимают значения, а не указатели, выход равен &{3 4} 5.

В обоих случаях v является указателем на объект Vertex. В первом случае указатель передается методам, и все работает так, как ожидалось - любые изменения, внесенные в объект Vertex, производятся с исходным значением, поэтому эти изменения сохраняются после возвращения метода. Во втором случае, хотя v все еще является указателем, компилятор Go достаточно умен, чтобы преобразовать v.Scale(5) в (*v).Scale(5), где v разыменовывается, а результирующее значение передается в Scale.

1
ответ дан joshlf 19 August 2018 в 15:14
поделиться
Другие вопросы по тегам:

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