gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:47:01 25 4
gpt4 key购买 nike

我正在研究 Michael Hartl 的 Rails 教程 (rails 4),我对如何使用 symbols 感到困惑。我理解为什么 symbols 用于 hashes,但我不知道为什么它们用于指代方法。例如,在下面的代码中,定义了一个名为 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。我不知道为什么要引入此更改,但我猜想 symbols 会保留一段时间,至少它们少输入一个字符:-)

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com