gpt4 book ai didi

ruby-on-rails - Ruby on Rails 和 Colons 的问题

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

我以前更像是一个爱好 Java 的人,现在尝试切换到 Ruby on Rails。但我遇到了一些困难,不管你信不信,我喜欢大括号和分号..给出了一些方向。

但问题是:现在我正在学习 RoR 的在线类(class),我突然想到,我在如何使用符号、哈希等方面总是错的。

示例 1:例如,让我们看一下这一行代码:

form_for(:session, :html => {class: "form-horizontal", role: "form"}, url: login_path)  

我是这样读的:

方法/函数名称是

form_for  

解析到这个方法的参数是:

:session, :html => {class: "form-horizontal", role: "form"}, url: login_path 

让我们把它们分解成

:session 

:html => {class: "form-horizontal", role: "form"}

url: login_path

我到底应该怎么知道如何声明这些参数?为什么 :session 和 :html passend 作为键而不是 url?:html 符号是 Hashmap 符号吗?

  1. 示例:

在模型文件中,您声明这样的 n:m 关系(例如用户 <-> 股票)

  has_many :users, through: :user_stocks

好的,我知道第一个参数是 :users,第二个参数与

:through => :user_stocks

正确吗?

但以同样的方式,让我们看一下来自同一项目的 routes.rb 配置:

  resources :user_stocks, except: [:show, :edit, :update]

现在我们在 except 散列上使用一个键数组,对吗?写问题时确实会变得更清楚,但仍然有关于何时使用的经验法则/约定

:name

name: value

:name => {values}?

name: [values]

还是只是个人喜好?在那种情况下,我应该希望我的在线老师保持一致。

一般来说,我对参数语法约定如何以及何时使用什么(什么类型的参数)感到很困惑。仅仅是因为我开始使用 Ruby 还是我错过了一些惯例。

我希望我的问题是可以理解的,请原谅我的英语不是母语。我真的很喜欢与 RoR 相处,但现在观看在线类(class)有时会让我比以前更加困惑,因为如果我自己完成,我会使用完全不同的方式。

最佳答案

How the heck should I know how to declare those parameters?

您在文档中查找该方法并了解它。

Parameters parsed to this method are:

:session, 
:html => {class: "form-horizontal", role: "form"},
url: login_path

How the heck should I know how to declare those parameters? Why are :session and :html passend in as keys and url not? Is the :html symbol a Hashmap-symbol?

在 ruby​​ 中,如果您在参数列表的末尾传入一系列键值对,ruby 会将它们全部收集到一个散列中,并将它们作为一个参数传递给该方法。这是一个例子:

def go(x, y)
p x
p y
end


go(:hello, a: 10, b: 20)

--output:--
:hello
{:a=>10, :b=>20}

另一个例子:

def go(x, y)
p x
p y
end

go(
:session,
:html => {class: "form-horizontal", role: "form"},
url: 'xyz'
)

--output:--
:session
{:html=>{:class=>"form-horizontal", :role=>"form"}, :url=>"xyz"}
has_many :users, through: :user_stocks

Ok, I get that the first argument is :users and the second is the same as

:through => :user_stocks

correct?

正确。在旧的 ruby​​ 中,哈希中的键值对是这样写的:

'a' => 'hello'

如果值是一个符号,那么它看起来像这样:

'a' => :hello

如果键也是一个符号,那么你写道:

:a => :hello

在现代 ruby​​ 中,如果键是一个符号,你可以这样写:

a: 'hello'

这是一个快捷方式:

:a => 'hello'

如果值也是一个符号,在现代 ruby​​ 中它看起来像这样:

a: :hello

这是一个快捷方式:

:a => :hello
resources :user_stocks, except: [:show, :edit, :update]

Now we're using an array of keys on the except hash, correct?

散列没有命名为 except,但除此之外你是正确的。

a rule of thumb / convention on when to use

    :name             #  Single symbol argument

name: value # A key-value pair in a hash. The key is a symbol.

:name => {values}? #A key-value pair in a hash. The value looks like a hash, but the syntax is incorrect.

name: [values] #A key-value pair in a hash. The value is your notation for an array.

Or is it just an personal preference? In that case I should hope that my online teacher stays consistent..

再一次,可以定义一个方法来接受任何类型的参数。因为 ruby​​ 变量没有类型,所以你必须查看文档。如果一个方法希望您传入一个散列,其中键 :name 的值是一个散列,那么您需要这样做。另一方面,如果该方法希望您传入一个散列,其中键 :name 的值是一个数组,那么您需要这样做。

Generally speaking, I'm very confused on how the parameter syntax convention is and when to use what (what type of argument). Is it just because I am starting with Ruby or did I miss some piece of convention.

Ruby 有很多快捷方式,可能会让初学者感到困惑。然后是整个 String v. Symbol 概念。如果您能理解 Symbol 和 String 之间的实际区别,那么您将领先于游戏。 Symbol 就像一个整数。所以当ruby要比较Symbols是否相等的时候,ruby比较两个整数,速度很快。如果 ruby​​ 必须比较字符串,那么 ruby​​ 必须将一个字符串中每个字母的 ascii 码与另一个字符串中每个字母的 ascii 码进行比较,直到 ruby​​ 发现不同为止。例如,为了让 ruby​​ 比较以下两个字符串:

"helloX" v. "helloY"

进行了六次整数比较之前,ruby 不会发现差异:

'h' v 'h' => equal
'e' v 'e' => equal
...
...
'X' v 'Y' => not equal

另一方面,如果 ruby​​ 正在比较:

:helloX  v.  :helloY

Symbols 基本上存储为单个整数,例如:

341343   v.  134142  => not equal

比较它们只需要一次整数比较,所以速度更快。正如肯定有人指出的那样,这并不是 Symbols 的实现方式,但细节并不重要。知道 Symbol 比较比 String 比较快就足够了,至于为什么这是真的,上面的例子足以证明至少有一个实现可以是真的。

关于ruby-on-rails - Ruby on Rails 和 Colons 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44187411/

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