Предотвращение неявной неоднозначности определения в Scala

Возможно, это больше вроде того, что Вы пропускаете:

, Если Вы происходите из C++ как точка зрения, делегаты берут немного привыкающее к - но в основном 'они просто работают'.

способ, которым это работает, состоит в том, что Вы устанавливаете некоторый объект, который Вы записали как делегат в NSWindow, но Ваш объект только имеет реализации (методы) для одного или нескольких из многих возможных методов делегата. Таким образом, что-то происходит, и NSWindow хочет назвать Ваш объект - он просто использует Цель-c's respondsToSelector метод, чтобы определить, хочет ли Ваш объект тот метод, названный, и затем называет его. Это - то, как объективные-c работы - методы ищутся по требованию.

Это полностью тривиально, чтобы сделать это с Вашими собственными объектами, нет ничего специального продолжения, Вы могли, например, иметь NSArray из 27 объектов, все различные виды объектов, только 18 некоторые из них имеющий метод -(void)setToBue;, другие 9 не делают. Таким образом для вызова setToBlue на всех из 18, которым нужен в сделанный, что-то вроде этого:

for (id anObject in myArray)
{
  if ([anObject respondsToSelector:@selector(@"setToBlue")])
     [anObject setToBlue]; 
}

другая вещь о делегатах состоит в том, что они не сохраняются, таким образом, всегда необходимо устанавливать делегата в nil в Вашем MyClass dealloc метод.

15
задан Synesso 27 August 2009 в 06:15
поделиться

4 ответа

Либо создайте огромный прокси-класс, либо откажитесь от него и потребуйте, чтобы клиент устранял неоднозначность:

100.asInstanceOf [String] .length

2
ответ дан 1 December 2019 в 04:10
поделиться

У меня нет решения, но я прокомментирую, что причина RichString методов недоступна после вашего intToString неявно заключается в том, что Scala не поддерживает цепочка неявных вызовов (см. 21.2 «Правила для имплицитов» в Программирование в Scala ).

Если вы введете промежуточную String , Scala выполнит неявное преобразование в RichString (этот неявный определен в Predef.scala ).

Например,

$ scala
Welcome to Scala version 2.7.5.final [...].
Type in expressions to have them evaluated.
Type :help for more information.

scala> implicit def intToString(i: Int) = String.valueOf(i)
intToString: (Int)java.lang.String

scala> val i = 100
i: Int = 100

scala> val s: String = i
s: String = 100

scala> s.reverse
res1: scala.runtime.RichString = 001
5
ответ дан 1 December 2019 в 04:10
поделиться

Единственный вариант, который я вижу, - это создать новый String Wrapper class MyString и позвольте этому вызывать любой метод, который вы хотите вызвать в неоднозначном случае. Затем вы можете определить неявные преобразования в MyString и два неявных преобразования из MyString в String и RichString, на всякий случай, если вам нужно передать их в библиотечную функцию.

2
ответ дан 1 December 2019 в 04:10
поделиться

I'm confused: can't you use .toString on any type anyway thus avoiding the need for implicit conversions?

1
ответ дан 1 December 2019 в 04:10
поделиться
Другие вопросы по тегам:

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