Ecto.Repo.delete / 2: Когда вы смотрите на спецификацию типа, как узнать, есть ли значение по умолчанию? - PullRequest
0 голосов
/ 09 мая 2019

Вот спецификация типа:

iex(1)> h Ecto.Repo.delete
No documentation for function Ecto.Repo.delete was found, but there is a callback with the same name.
You can view callback documentations with the b/1 helper.

iex(2)> b Ecto.Repo.delete
@callback delete(
            struct_or_changeset :: 
              Ecto.Schema.t() | Ecto.Changeset.t(),
            opts :: Keyword.t()
          ) ::
            {:ok, Ecto.Schema.t()}
            | {:error, Ecto.Changeset.t()}

Deletes a struct using its primary key.

If the struct has no primary key,
Ecto.NoPrimaryKeyFieldError will be raised. If the struct
has been removed from db prior to call,
Ecto.StaleEntryError will be raised.

It returns {:ok, struct} if the struct has been
successfully deleted or {:error, changeset} if there was a
validation or a known constraint error.

## Options

  • :prefix - The prefix to run the query on (such as
    the schema path in Postgres or the database in MySQL).
    This overrides the prefix set in the query and any
    @schema_prefix set in the schema.
  • :stale_error_field - The field where stale errors
    will be added in the returning changeset. This option
    can be used to avoid raising Ecto.StaleEntryError.
  • :stale_error_message - The message to add to the
    configured :stale_error_field when stale errors happen,
    defaults to "is stale".

See the "Shared options" section at the module
documentation.

## Example

    post = MyRepo.get!(Post, 42)
    case MyRepo.delete post do
      {:ok, struct}       -> # Deleted with success
      {:error, changeset} -> # Something went wrong
    end 

В приведенном в конце примере вызывается delete () с одним аргументом.И я могу успешно вызвать delete() с одним аргументом:

  def delete_item(%Auction.Item{}=item) do
    @repo.delete(item)  #<=== HERE
  end

Итак, это говорит мне, что второй аргумент должен иметь значение по умолчанию.Есть ли способ узнать это как-нибудь?

1 Ответ

2 голосов
/ 09 мая 2019

Просматривая документы и ответ на аналогичный вопрос , кажется, что аргументы по умолчанию не поддерживаются в спецификациях типов. Этот выпуск Github от 2014 года объясняет некоторые из компромиссов этой функции.

Как узнать, что второй аргумент необязателен? Помимо исходного кода Elixir, надеюсь, он задокументирован. В случае этой версии Ecto.Repo.delete аргумент назван opts в спецификации типов и описан под заголовком «Опции», что, как мне кажется, настоятельно рекомендует, чтобы они были необязательными.

...