如何在Ruby中使用符号

时间:2013-08-23 02:33:56

标签: ruby-on-rails ruby rspec

我正在学习迈克尔·哈特尔的Tutorial中的Rails,我对符号如何工作/如何使用感到困惑。

以下是注册页面测试中的代码段:

  describe "signup" do

    before { visit signup_path }

    let(:submit) { "Create my account" }

    describe "with invalid information" do
      it "should not create a user" do
        expect { click_button submit }.not_to change(User, :count)
      end
    end

我的问题是,这不应该是click_button :submit冒号(:)吗?

我知道符号就像不可变的字符串,不能分配像:submit = "Create my account"这样的值。但那么let()方法究竟做了什么呢?

我有Java背景,我对符号概念感到困惑。

2 个答案:

答案 0 :(得分:3)

您遇到rspec问题,而不是符号问题。在Java术语中,符号是final Stringenum之间的符号,我相信您的理解是恰当的。这是一个关键问题:

  

但那么let()方法究竟做了什么?

let是一个rspec方法,它定义了为每个示例设置的变量。所以,基本上,

let(:submit) { "Create my account" }

(其中:submit是符号)指示rspec执行类似

的操作
submit = "Create my account"

(其中submit是变量)在每个it块之前。

(这是一种简化。submit这里定义的let实际上不是变量,而是方法名称,它首先返回let中提供的块的评估每个示例中的调用,以及同一示例中每个后续调用的缓存值。但是您可以将其视为只读变量。在某种程度上,let :submit { ... }的作用类似于{{ 1}}:它们都在当前上下文中动态插入方法。)

详细了解attr :submit here

答案 1 :(得分:0)

除了module Fooclass Foodef fooalias foodefined?{foo}等几个硬连线结构之外,没有办法引用未定义的方法/变量/常数逐字。

let之类的场合,使用符号或字符串代替。 let本身并没有对:submit做任何事情。它定义了一个名为submit的方法,方法submit的拼写由符号:submit给出。如果方法let被设计为采用类似"submit"的字符串,那么这将同样有效。