Юлия: Та же функция для нескольких типов? - PullRequest
0 голосов
/ 27 августа 2018

У меня есть эта большая функция, которую я определил для вектора, но я бы хотел, чтобы она работала также с одним значением. Мне бы хотелось, чтобы тип первого аргумента был вектором или числом.

Я пишу следующее:

function bigfunction(x::Vector, y::Float64=0.5)

  # lots of stuff
  z = x .+ y
  return z
end


bigfunction(x::Number) = bigfunction()

Функция работает с вектором, но не с числом.

bigfunction([0, 1, 3])
bigfunction(2)

Должен ли я что-то сделать с Union{}, как я иногда видел? Или переопределить метод по-другому?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Этот вопрос и ответы помогают мне проиллюстрировать замечания Криса Ракауцкаса, написанные Крисом Ракаукасом в сообщении о типовой рассылке в Юлии.

Я сопоставил ответы в следующем коде:

# I ran this only in Julia 1.0.0.

## ========== Original function ==========
## function bigfunction(x::Vector, y::Float64=0.5)
##     # lots of stuff
##     z = x .+ y
##     return z
## end
## bigfunction(x::Number) = bigfunction()
## println(bigfunction([0, 1, 3]))
## println(bigfunction(2))
## ---------- Output has ERROR ----------
## [0.5, 1.5, 3.5]
## ERROR: LoadError: MethodError: no method matching bigfunction()


# ========== Answer Suggested by Picaud Vincent in comments ==========
# Note use of Union in function signature.
function bigfunction(x::Union{Vector, Number}, y::Float64=0.5)
    # lots of stuff
    z = x .+ y
    return z
end
println(bigfunction([0, 1, 3]))
println(bigfunction(2))
## ---------- Output Okay ----------
## [0.5, 1.5, 3.5]
## 2.5


# ========== Answer Suggested by Robert Hönig in comments ==========
# Note change in line right after function definition.
function bigfunction(x::Vector, y::Float64=0.5)
    # lots of stuff
    z = x .+ y
    return z
end
bigfunction(x::Number) = bigfunction([x])
println(bigfunction([0, 1, 3]))
println(bigfunction(2))
## ---------- Output Okay ----------
## [0.5, 1.5, 3.5]
## 2.5


# ========== Answer Suggested by Chris Rackauckas ==========
# Note change in function signature using duct typing--no type for x.
function bigfunction(x, y=0.5)
    # lots of stuff
    z = x .+ y
    return z
end
println(bigfunction([0, 1, 3]))
println(bigfunction(2))
## ---------- Output Okay ----------
## [0.5, 1.5, 3.5]
## 2.5
0 голосов
/ 28 августа 2018

Или тип утки. Помните, что функции всегда автоматически специализируются, поэтому выбор ограниченных отправок никак не влияет на производительность.

function bigfunction(x, y=0.5)

  # lots of stuff
  z = x .+ y
  return z
end

Это будет так же эффективно, но будет работать на многих других типах. Для получения дополнительной информации см. этот пост в блоге о типах рассылки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...