使用符号作为ruby方法的参数 [英] Using symbols as arguments to ruby methods

查看:164
本文介绍了使用符号作为ruby方法的参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在学习rails并回到ruby以了解rails中的方法(以及ruby是否真的有效)。当我看到如下方法调用时:

  validates validates:first_name,:presence =>真

我很困惑。你如何在Ruby中写入接受符号或哈希的方法。验证方法的源代码也很混乱。有人可以简化这个话题,使用符号作为ruby类和实例方法的参数吗?



UPDATE:



<好的@Dave!但是我试过的东西是这样的:
$ b $ pre $ def $ full_name(:first_name,:last_name)
@first_name = :first_name
@last_name =:last_name
p#{first_name}#{last_name}
end
$ b full_name(Breta,Von Sustern)

这显然会引发错误。我试图理解:为什么像这样传递符号作为参数错误,如果符号与任何其他值一样?解析方案

符号和哈希值是任何其他值,并可以像任何其他值类型传递。



回想一下,ActiveRecord模型接受散列作为参数;它最终与此类似(这不是这么简单,但最后它是一样的):

  class User 
attr_accessor:fname,:lname
$ b $ def初始化(args)
@fname = args [:fname]如果args [:fname]
@lname = args [: lname] if args [:lname]
end
end

u = User.new(:fname =>'Joe',:lname =>'Hacker')

这样可以不必将哈希放在花括号中 {} 除非你需要消除参数的歧义(并且在跳过parens的时候还有块解析问题)。



同样:

  class TestItOut 
attr_accessor:field_name,:validations

def initialize(field_name,validations)
@field_name = field_name
@validations =验证
结束

def show_validations
puts验证字段'#{field_name}':
验证每个d o | type,args |
把validator'#{type}'放在args'#{args}''
end
end
end

t = TestItOut.new :姓名,状态:真,长度:{最小:2,最大:10})
t.show_validations

输出:

 验证字段'name':
validator'presence'with args' '
validator'length'with args'{min:2,max:10}'



<从那里你可以开始看到这样的事情。


I am learning rails and going back to ruby to understand how methods in rails (and ruby really work). When I see method calls like:

validates validates :first_name, :presence => true

I get confused. How do you write methods in ruby that accept symbols or hashes. The source code for the validates method is confusing too. Could someone please simplify this topic of using symbols as arguments in ruby class and instance methods for me?

UPDATE:

Good one @Dave! But What I was trying out was something like:

def full_name (:first_name, :last_name)
  @first_name = :first_name
  @last_name = :last_name
  p "#{@first_name} #{last_name}"
end

full_name("Breta", "Von Sustern")

Which obviously raises errors. I am trying to understand: Why is passing symbols like this as arguments wrong if symbols are just like any other value?

解决方案

Symbols and hashes are values like any other, and can be passed like any other value type.

Recall that ActiveRecord models accept a hash as an argument; it ends up being similar to this (it's not this simple, but it's the same idea in the end):

class User
  attr_accessor :fname, :lname

  def initialize(args)
    @fname = args[:fname] if args[:fname]
    @lname = args[:lname] if args[:lname]
  end
end

u = User.new(:fname => 'Joe', :lname => 'Hacker')

This takes advantage of not having to put the hash in curly-brackets {} unless you need to disambiguate parameters (and there's a block parsing issue as well when you skip the parens).

Similarly:

class TestItOut
  attr_accessor :field_name, :validations

  def initialize(field_name, validations)
    @field_name = field_name
    @validations = validations
  end

  def show_validations
    puts "Validating field '#{field_name}' with:"
    validations.each do |type, args|
      puts "  validator '#{type}' with args '#{args}'"
    end
  end
end

t = TestItOut.new(:name, presence: true, length: { min: 2, max: 10 })
t.show_validations

This outputs:

Validating field 'name' with:
  validator 'presence' with args 'true'
  validator 'length' with args '{min: 2, max: 10}'

From there you can start to see how things like this work.

这篇关于使用符号作为ruby方法的参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆