Вам просто нужно проверить массив по индексу i
с isDefinedAt
, если он существует:
def do_to_elt(i:Int, j:Int): Unit =
if (a.isDefinedAt(i) && a(i).isDefinedAt(j)) f(a(i)(j))
РЕДАКТИРОВАТЬ: Пропустил ту часть об элегантном решении, как я сосредоточилсяоб ошибке в коде перед редактированием.
По поводу элегантности: нет, по сути, нет способа выразить это более элегантным способом.Некоторые могут посоветовать вам использовать pimp-my-library -Pattern, чтобы он выглядел более элегантно, но на самом деле это не так.
Если ваш единственный вариант использования - выполнитьфункция с элементом многомерного массива, когда индексы действительны, тогда этот код делает это, и вы должны его использовать.Вы можете обобщить метод, изменив сигнатуру для функции, применяемой к элементу, и, возможно, значение, если индексы недопустимы, например:
def do_to_elt[A](i: Int, j: Int)(f: Int => A, g: => A = ()) =
if (a.isDefinedAt(i) && a(i).isDefinedAt(j)) f(a(i)(j)) else g
, но я бы не стал ничего менять.Это также не выглядит более элегантно, но расширяет ваш вариант использования.
(Также: если вы работаете с массивами, вы в основном делаете это из соображений производительности, и в этом случае может быть даже лучше не использоватьisDefinedAt
, но выполнять проверки достоверности на основе длины массивов.)