ruby-on-rails - Rails 方法在用作参数时被称为符号?

标签 ruby-on-rails ruby ruby-on-rails-4 symbols

我正在研究 Michael Hartl 编写的 Rails 教程 (rails 4),但我对符号的使用方式感到困惑。我理解为什么符号用于哈希,但我不知道为什么它们用于引用方法。例如,在下面的代码中,定义了一个名为 signed_in_user 的方法,当传递给 before_action 时,该方法被称为 :signed_in_user:edit:update 也是如此。

class UsersController < ApplicationController
  before_action :signed_in_user, only: [:edit, :update]
  .
  .
  .
  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end

    # Before filters

    def signed_in_user
      redirect_to signin_url, notice: "Please sign in." unless signed_in?
    end
end

谢谢!

最佳答案

如果您查看 ruby​​ 2.1 中的 Object#send 接口(interface),您会首先发现 symbol 变体,然后是 string 变体,但在 ruby​​ 2.0 之前,只有 symbol 变体!由于所有方法都将通过 #send 传递,因此在引用方法时使用其参数是有意义的,以避免在任何地方不断调用 #to_sym。我不知道为什么要引入这一更改,但我猜符号会保留一段时间,至少它们会少输入一个字符:-)

不言而喻,符号在整个程序中只分配一次,它们不会被垃圾收集,因此比字符串更有效。由于处理器的速度仍然比 RAM 更快,我想这种区别最近已经变得不那么重要了。

正如您在 discussion of new features of ruby 2.1 中看到的那样符号和卡住字符串之间的差异正在变得越来越小。卡住的字符串现在只分配一次,符号现在被卡住,甚至有一个关于符号将来可能被垃圾收集的提示。如果外部数据被转换为符号,这最终将消除拒绝服务攻击的攻击向量。另一方面,defdefine_method 现在返回它们定义为符号的方法的名称(而不是像以前那样返回 nil) .

关于ruby-on-rails - Rails 方法在用作参数时被称为符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24796338/

相关文章:

css - 在 Rails 中加载 CSS

ruby-on-rails - haml、link_to helper 和 I18n 在同一个句子中

ruby-on-rails - Ubuntu 上的 Ruby on Rails - 多个错误

ruby-on-rails - 如何配置 ActiveJob 以使用 Resque?

ruby - 尽管未定义操作和路由,但 RSpec 成功

ruby-on-rails - 设置activeadmin gem后Rails api脚手架问题

ruby-on-rails - HTTP::Request::UnsupportedSchemeError -- Rails -- HTTP gem

ruby-on-rails - Rails、Devise、Heroku 从控制台删除用户帐户

ruby-on-rails - 比较 Rails 中的 updated_at

ruby-on-rails - 无法将瘦服务器作为服务启动,RubyGems : Could not find thin