1

我明白符号和字符串是不一样的,但我不明白符号的概念。

据我了解,符号指的是别的东西。我在这里使用“引用”一词是为了更好地理解,而不是在 C/C++ 指针或引用的意义上。

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

    resources :posts
    

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 知道它必须Post从 DB 中提取每个值,是不是某个常量值(不是字符串)?

4

5 回答 5

2

Ruby 中的ASymbol只是一个具有特殊语法的不可变字符串。它主要用于进行字符串匹配操作时可以使用更少的内存,如下所示:

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

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

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

将创建两个字符串,因为 Ruby 中的字符串是可变的。所以,不,没有特殊含义,也不是指其他东西,这主要是对 Ruby 中的字符串默认情况下是可变的事实的一种破解。

至于您的最后一个问题, :all 只是该方法以“a == :all ? return all : so something else”之类的方式实现的值。它只是一个方法参数。

于 2013-10-18T13:05:27.540 回答
2

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

于 2013-10-18T13:05:48.167 回答
0

:allSymbol类的实例,它是内置的 Ruby 类。全部

@posts1 = Post.find(:all)

line 是不推荐将所有帖子加载到@posts1变量的方式。:all符号表示您要获取所有帖子。如果您键入:

@post = Post.find(5)

您只会收到一篇文章,即 id = 5 的文章。

于 2013-10-18T13:04:05.143 回答
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

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

于 2013-10-18T13:26:31.933 回答
0

我会推荐你​​看看这个博客Ruby Symbol and String。

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

于 2013-10-18T13:26:40.570 回答