在Ruby中为属性创建别名的最佳方法是什么?

18 ruby

在Ruby中为实例属性创建别名的最佳方法是什么(我不使用rails或任何ruby gem,只是Ruby).
例如,给定下面的类,如何为:student_name属性访问器创建别名?

class Student
  attr_accessor :student_name
  alias :name :student_name    #wrong
end

s = Student.new
s.student_name = "Jordan"
puts s.name  # --> Jordan
s.name = "Michael" # --> NoMethodError: undefined method `name=' for #<Student:0x572394> ...
Run Code Online (Sandbox Code Playgroud)

多谢你们!

Joh*_*hat 29

alias :name :student_name    # not wrong, only for getter
alias :name= :student_name=  # add this for setter
Run Code Online (Sandbox Code Playgroud)


Chu*_*uck 13

正如约翰所指出的那样,你需要为读者和作者添加别名.这是Ruby,很容易定义自己的别名方法来为你处理这个问题.

class Module
  def attr_alias(new_attr, original)
    alias_method(new_attr, original) if method_defined? original
    new_writer = "#{new_attr}="
    original_writer = "#{original}="
    alias_method(new_writer, original_writer) if method_defined? original_writer
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 我只是在这里很挑剔,但我更愿意称其为alias_attr以与alias_method保持一致。这样,两者都将具有alias_thingtoalias的形式。 (2认同)

Sac*_*hin 12

对于Rails

alias_attribute new_name, old_name

来源http://api.rubyonrails.org/classes/ActiveModel/AttributeMethods/ClassMethods.html#method-i-alias_attribute

使用案例:当您(很可能)想要更改属性名称而不更改架构且不破坏现有功能时

  • 最初的问题明确指出“我不使用 Rails”,并且此解决方案仅适用于使用 Rails 的人。 (2认同)