如何摆脱'new'来实例化Ruby对象?

JCL*_*CLL 3 ruby

出于美观的原因,我想从我的一些类中提供对象实例化的语法,而不是关键字"new".我从来没有尝试过,但我知道这是可能的:例如Matrix gem提供了如下语法:

Matrix [ [1,2], [3,4] ] 
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

Ser*_*sev 7

只需定义一个将调用的具有相同名称(类的名称)的方法.new.

class User
  def initialize(name)
    @name = name
  end

  attr_reader :name
end

def User(name)
  User.new(name)
end

u = User("Sergio")
u.name # => "Sergio"
Run Code Online (Sandbox Code Playgroud)

注意:我个人不喜欢这种技术.导致难以理解代码."只是看起来更好"的原因并不能成为你的理由.

实际上,它是红宝石中的一种模式,称为"转换方法".如果仔细观察,ruby stdlib中的所有大写方法都会将值从一种形式转换为另一种形式.除非您正在编写转换方法,否则请勿执行此操作.