当用作参数时,Rails方法被称为符号?

时间:2014-07-17 06:29:53

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

我正在研究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

谢谢!

2 个答案:

答案 0 :(得分:2)

如果你看一下ruby 2.1中Object#send的界面,你会先找到symbol变种,然后找到string变种,但是以前会有symbol变体!由于所有方法都将通过#send传递,因此无论您何时引用方法,都可以使用其参数,以避免在任何地方不断调用#to_sym。我不知道为什么会引入这种变化,但我想symbols会坚持一段时间,至少它们只需输入一个字符: - )

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

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

答案 1 :(得分:1)

<强>符号

你需要知道的是Ruby如何对待:symbols - 我不确切知道,但它基本上是一种表达数据的方式:

  

在前面的每个断言中都有一些真实的元素,并且   但在我看来,它们并不具有价值,部分原因在于它们依赖   深入了解Ruby以了解其重要性。我更喜欢   回答问题&#34;什么是符号&#34;在语言独立   方式:

     

Ruby符号是一个具有数字(整数)的东西   表示和字符串表示。

它们通常用于(根据我的经验),使您能够使用一段数据填充对象,这些数据可以是&#34; raw&#34; data(字符串/整数),方法名称或对象。

在表示symbols时,您通常会使用arguments,这看起来就像这里一样

-

<强>回调

控制器中的before_action方法被称为回调(我认为)

回调用于为您提供一种控制应用程序数据流的方法,而不会干扰实际的进程本身。例如,可以调用before_save callbacks来对准备保存的对象执行操作,而不会干扰保存过程本身

使用before_action回调,Rails需要的参数如下:

enter image description here

基本上,你传递一个method name作为symbol意味着Ruby可以读取它的内容,而不是必须弄清楚它是否&#34;字符串&# 34;等

这是我的解释