我正在研究 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 中看到的那样符号和卡住字符串之间的差异正在变得越来越小。卡住的字符串现在只分配一次,符号现在被卡住,甚至有一个关于符号将来可能被垃圾收集的提示。如果外部数据被转换为符号,这最终将消除拒绝服务攻击的攻击向量。另一方面,def
和 define_method
现在返回它们定义为符号的方法的名称(而不是像以前那样返回 nil
) .
关于ruby-on-rails - Rails 方法在用作参数时被称为符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24796338/