我正在研究Michael Hartl撰写的Rails Tutorial(rails 4),我对如何使用symbols
感到困惑。我理解为什么symbols
用于hashes
,但我不知道为什么它们用于引用方法。例如,在下面的代码中,定义了一个名为signed_in_user
的方法,在传递给:signed_in_user
时称为before_action
。 :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
谢谢!
答案 0 :(得分:2)
如果你看一下ruby 2.1中Object#send
的界面,你会先找到symbol
变种,然后找到string
变种,但是以前会有symbol
变体!由于所有方法都将通过#send
传递,因此无论您何时引用方法,都可以使用其参数,以避免在任何地方不断调用#to_sym
。我不知道为什么会引入这种变化,但我想symbols
会坚持一段时间,至少它们只需输入一个字符: - )
不用说,符号在整个程序中只分配一次,它们不会被垃圾收集,因此比字符串稍微有效一些。由于处理器的速度仍然比RAM快,我猜这种区别最近变得不那么重要了。
正如您在discussion of new features of ruby 2.1中所看到的,符号和冻结字符串之间的差异正在变得越来越小。现在,冻结的字符串只被分配一次,符号现在被冻结,甚至还有关于未来可能被垃圾收集的符号的提示。如果将外部数据转换为符号,这最终将消除拒绝服务攻击的攻击向量。另一方面,def
和define_method
现在返回他们定义为符号的方法的名称(而不是像过去那样返回nil
。)
答案 1 :(得分:1)
<强>符号强>
你需要知道的是Ruby如何对待:symbols
- 我不确切知道,但它基本上是一种表达数据的方式:
在前面的每个断言中都有一些真实的元素,并且 但在我看来,它们并不具有价值,部分原因在于它们依赖 深入了解Ruby以了解其重要性。我更喜欢 回答问题&#34;什么是符号&#34;在语言独立 方式:
Ruby符号是一个具有数字(整数)的东西 表示和字符串表示。
它们通常用于(根据我的经验),使您能够使用一段数据填充对象,这些数据可以是&#34; raw&#34; data(字符串/整数),方法名称或对象。
在表示symbols
时,您通常会使用arguments
,这看起来就像这里一样
-
<强>回调强>
控制器中的before_action
方法被称为回调(我认为)
回调用于为您提供一种控制应用程序数据流的方法,而不会干扰实际的进程本身。例如,可以调用before_save
callbacks来对准备保存的对象执行操作,而不会干扰保存过程本身
使用before_action
回调,Rails需要的参数如下:
基本上,你传递一个method name
作为symbol
意味着Ruby可以读取它的内容,而不是必须弄清楚它是否&#34;字符串&# 34;等
这是我的解释