为什么我们使用符号作为参数?

时间:2015-08-27 03:00:37

标签: ruby-on-rails ruby symbols

型号:

class Tweet < ActiveRecord::Base
 has_one :location, dependent: :destroy
end

class Location < ActiveRecord::Base
 belongs_to :tweet
end

控制器:

class TweetsController < ApplicationController 
 def index
  @tweets = Tweet.recent.includes(:location) 
 end
end

为什么我们在ruby中使用符号(:location)作为参数?

为什么这不起作用?

@tweets = Tweet.recent.includes(location) 

2 个答案:

答案 0 :(得分:1)

因为你传递的是一个活跃记录将用于构建sql查询的字符串。没有冒号的位置将是局部变量。我们可以传递一个类(Location),但是对于ActiveRecord来说,符号更有效。符号是一个不可变的字符串,本质上是一种指向字符串的指针,因此非常有效。

答案 1 :(得分:0)

将哈希作为参数传递给方法是很常见的,因为那样你就不必担心参数的排序了。此外,经常用于可选参数。请考虑以下示例:

def method_with_args(name, age, dollar_amount, occupation) # gets sort of ugly and error prone
  # do something with args
end

def method_with_hash(hash = {}) # cleans up ordering and forces you to 'name' variables  
  name = hash[:name]
  age = hash[:age]
  dollar_amount = hash[:dollar_amount]
  occupation = hash[:occupation]
  # do stuff with variables
end

问题的第二部分:

@tweets = Tweet.recent.includes(location)

此处的位置应该被定义为调用该方法的对象上的变量或方法。如果您运行代码,错误将提示您输入该信息。

在散列访问和性能方面:对散列的符号访问速度提高约2倍。字符串访问在每次实例化时都会为内存分配一个字符串,从而创建大量垃圾对象。请看看blog post