我做的符号对吗?

时间:2013-10-18 12:56:46

标签: ruby-on-rails ruby

我理解符号和字符串不相同,但我不理解符号的概念。

据我所知,符号指的是其他东西。为了更好地理解,我在这里使用了这个词,而不是在C / C ++指针或引用的意义上。

  1. 当我使用像rails g controller Posts之类的东西在Rails中创建一个新控制器时,Ruby会自动创建一个新符号:posts,它引用Posts控制器吗?是否可以从应用程序的任何位置全局访问此:posts符号?只有在这种情况下,我才能理解如下构造:

    resources :posts
    
  2. Ruby可以自己翻译:“好的,我知道:posts引用posts_controller,所以我需要为该控制器创建CRUD路由”。我是对的吗?

    1. 符号:title:content在此示例中有哪些角色?我假设form.label等同于form.label(:title)

      <%= form_for @post, :html => {:class => "new_post"} do |form| %>
      <%= form.label :title %><br>
      <%= form.text_field :title %><br>
      
      <%= form.label :content %><br>
      <%= form.text_area :content %><br>
      
      <%= form.submit("Add new post") %>
      
        
    2. 是否有像:all这样的内置符号和在路上创建的符号?当我在路上说,当我创建一些方法时,我可以看到:

      def something
          ...
      end
      

      Ruby是否会创建一个新符号:something,它将引用方法something?如果这是正确的,为什么我需要该符号,我在哪里可以使用它?

      @posts = Post.all #Or Post.all() => Standard OOP approach, i know what happens here
      @posts1 = Post.find(:all) # Dont know what happens here
      

      @posts1怎么样,我在这做什么? :all在这里意味着什么? Ruby知道必须从DB中提取每个Post,这是一些常量值(不是字符串)吗?

5 个答案:

答案 0 :(得分:2)

Ruby中的Symbol只是一个具有特殊语法的不可变字符串。它主要用于在执行字符串匹配时使用较少的内存,如:

options = { :me => 'joe' }
puts options[:me]

如果您使用字符串,则会为:me创建一个符号:

options = { 'me' => 'joe' }
puts options['me']

因为Ruby中的字符串是可变的,所以会创建两个字符串。所以,不,没有特别的意义,并且它不是引用其他东西的东西,它主要是对Ruby中的字符串默认是可变的这一事实的黑客攻击。

关于你的上一个问题,:all只是一个值,该方法在“a ==:all?返回所有东西:其他东西”之类的东西中实现。它只是一个方法参数。

答案 1 :(得分:2)

符号只是一个不可变的实习字符串,这意味着具有相同值的所有符号变量都指向完全相同的内存位置。它们也从不收集垃圾,因此避免使用to_sym创建它们。它们经常被用作哈希表中的键,但是这里有一些问题 - 你从外部库(例如API客户端)收到的一些哈希表将字符串作为键,所以当你试图获得与{{{{{{ 1}}你会得到obj[:some_attribute]

答案 2 :(得分:0)

:allSymbol类的实例,它是内置的Ruby类。所有

@posts1 = Post.find(:all)
不推荐使用

行将所有帖子加载到@posts1变量。 :all符号表示您要获取所有帖子。如果输入:

@post = Post.find(5)

你只能获得一个帖子,id = 5。

答案 3 :(得分:0)

符号与字符串相同,但具有相同值的符号具有相同的内存地址。这是一个关键的区别。

puts 'string'.object_id
puts 'string'.object_id
puts 'string'.object_id

#=> 3099310
#=> 3099310
#=> 3099310

puts :symbol.object_id
puts :symbol.object_id
puts :symbol.object_id

#=> 3098410
#=> 3021341
#=> 3012440

 Post.find :all

相同
Post.find 'all'

:posts不是对posts_controller的引用

resources :posts

这是什么意思?资源是一种生成标准CRUD路由的方法。对于搜索控制器,它使用命名约定。如果资源命名为:posts,则将路由设置为PostsController。

答案 4 :(得分:0)

我建议您查看此博客Ruby Symbol and String.

除了符号和字符串定义之外,您将获得更多详细信息示例。