Ruby 语法问题 : Rational(a, b) 和 Rational.new!(a, b)

标签 ruby syntax constructor instantiation parentheses

今天我在 Rational 中遇到了奇怪的 ruby​​ 语法类:

Rational(a,b)

(请注意,与普通的 Ruby 语法相比,缺少 .new() 部分)。与普通的 new 语法相比,这究竟意味着什么?更重要的是,我如何在自己的代码中实现这样的东西,为什么要实现这样的东西?专门针对Rational类,为什么使用这种语法而不是正常的实例化呢?为什么 new 方法在 rational 类中是私有(private)的? (以及我如何/为什么要在我自己的 ruby​​ 代码中这样做?) 预先感谢您的回答,特别是因为我问了这么多问题。

最佳答案

您所要做的就是声明一个与您的类同名的全局函数。这就是 rational.rb 所做的:

def Rational(a, b = 1)
  if a.kind_of?(Rational) && b == 1
    a
  else
    Rational.reduce(a, b)
  end
end

将构造函数设为私有(private):

private :initialize

对于 new 方法也是如此:

private_class_method :new

我想 Rational.new 可以保持公开并做 Rational() 做的事情,但是有一个方法将它的参数转换为实例与 Array()String() 等。这是一种熟悉的模式,易于实现和理解。

关于Ruby 语法问题 : Rational(a, b) 和 Rational.new!(a, b),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4034174/

相关文章:

ruby - 为什么我的插入排序比合并排序快?

java - Java中的 "@Override"有什么用?

JavaScript:没有函数/parens-parens/未知语法的参数列表

syntax - 编号列表作为 YAML 数组

c# 命名空间已经包含继承类的定义,那么如何添加构造函数

java - 实例化类时抛出异常

spring-boot - 在 Spring Boot 中 Autowiring 参数化构造函数

ruby-on-rails - 我可以使用 link_to 链接图像和文本吗

mysql - 如何为 Rails 中已存在的表创建迁移

ruby - 正则表达式拆分空白但不转义空白