ruby中的:id、id:和id有什么区别?

问题描述 投票:0回答:1

我正在尝试构建一个 ruby on Rails 和 graphQL 应用程序,并且正在研究用户更新突变。我花了很长时间想弄清楚,当我不小心打错字时,它突然起作用了。

以下是工作迁移:

module Mutations
  class UpdateUser < BaseMutation
    argument :id, Int
    argument :first_name, String
    argument :last_name, String
    argument :username, String
    argument :email, String
    argument :password, String

    field :user, Types::User
    field :errors, [String], null: false

    def resolve(id:, first_name:, last_name:, username:, email:, password:)
      user = User.find(id)
      user.update(first_name:, last_name:, username:, email:, password:)
      { user:, errors: [] }
    rescue StandardError => e
      { user: nil, errors: [e.message] }
    end
  end
end

我感到困惑的是,当我定义参数时,它们首先是冒号:例如

:id
:first_name

当我将它们传递给解析方法时,它们仅在后面有冒号时才起作用:例如

id:
first_name:

当我将变量传递给更新方法时,对于除 ID 之外的所有变量,它们使用相同的冒号语法。由于某种原因,当我使用

id:
时,它解析为字符串“id”,并且首先使用冒号
:id
返回未定义的错误。

只有当我不小心删除了冒号,并尝试

id
时,它才真正解析为传递的值。

我的问题是,为什么会出现这种情况,又是如何表现的?我尝试在文档中找到答案,并阅读其他帖子,但一直无法找到答案。

请有人帮助我的大脑解决这个问题,来自 PHP 背景,Ruby 正在融化我的大脑。

ruby-on-rails ruby graphql mutation
1个回答
3
投票

从 PHP 而来的 Ruby 需要一些时间来适应,但也不会太糟糕。

本质上,

id
是一个变量,或者像
model_instance.id
一样使用时的对象/模型属性。在 PHP 中,这类似于
$id
$object_instance->id

当您看到

id:
时,它是键值对中的键,因此它期望后面有一些内容(值)(或者假设
nil
如果没有后面的内容,通常在使用关键字参数的方法定义中,如您的示例)。典型的用法可能是
model_instance.update(id: 25)
,您实际上是将哈希值传递给
update
方法,其中
id
作为键,
25
作为值。在 Ruby 中编写此代码的较旧方法是使用“哈希火箭”,如下所示:
model_instance.update(:id => 25)

有关 Ruby 哈希的更多阅读:https://www.rubyguides.com/2020/05/ruby-hash-methods
有关关键字参数的更多阅读:https://www.rubyguides.com/2018/06/rubys-method-arguments

现在,如果您注意哈希火箭现在使用您所询问的第三种类型。当您看到像这样的字符串前面有一个冒号时,它被称为“符号”,需要一些时间来习惯它们,但它们本质上是 Ruby 中的字符串,需要定义的字符少一个(并且不可变)。 Ruby 人们通常不使用

'id'
"id"
作为字符串,而是喜欢使用
:id
作为符号,并且通常会在需要时自动转换为字符串。一个很好的例子可能是某种枚举器。

state = :ready
if state == :ready
  state = :finished
else
  state = :undefined
end

有关 Ruby 符号的更多阅读:https://www.rubyguides.com/2018/02/ruby-symbols

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.