我理解符号和字符串不相同,但我不理解符号的概念。
据我所知,符号指的是其他东西。为了更好地理解,我在这里使用了这个词,而不是在C / C ++指针或引用的意义上。
当我使用像rails g controller Posts
之类的东西在Rails中创建一个新控制器时,Ruby会自动创建一个新符号:posts
,它引用Posts
控制器吗?是否可以从应用程序的任何位置全局访问此:posts
符号?只有在这种情况下,我才能理解如下构造:
resources :posts
Ruby可以自己翻译:“好的,我知道:posts
引用posts_controller
,所以我需要为该控制器创建CRUD路由”。我是对的吗?
符号: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") %>
是否有像: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
,这是一些常量值(不是字符串)吗?
答案 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)
:all
是Symbol
类的实例,它是内置的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.
除了符号和字符串定义之外,您将获得更多详细信息示例。