调用它两次的Ruby类方法?

时间:2017-01-20 02:16:30

标签: ruby class methods

class Tests
  def self.test1
    'This is the First'
  end

  def self.test2
    'This is the second'
  end
end
puts Tests.test1.test2

我一直收到错误

undefined method `test2' for "This is the First":String (NoMethodError).

我假设无法调用第二类方法。但是我正在编写一些可以告诉我可行的东西。任何人都可以确认或帮助解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

如果从每个方法返回self,则可以无限次链接它们:)

注意:我已为每个方法添加了puts,因为否则所有方法都会返回self

class Tests
  def self.test1
    puts 'This is the First'
    self
  end

  def self.test2
    puts 'This is the second'
    self
  end
end

Tests.test1.test2
#=> This is the First
#=> This is the second

基本上你在方法中执行一些逻辑,当它完成后,你返回对象本身,这样就可以在对象上调用每个链式方法调用,而不是在前一个方法的结果上调用(当没有时self已退回。)

答案 1 :(得分:2)

看起来您正在尝试构建一个流畅的界面"

基本思想是当对象上的所有方法都返回<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.full.min.js"></script> <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet"/> <select id="example" style="width: 300px"> <option value="JAN">January</option> <option value="FEB">February</option> <option value="MAR">March</option> <option value="APR">April</option> <option value="MAY">May</option> <option value="JUN">June</option> <option value="JUL">July</option> <option value="AUG">August</option> <option value="SEP">September</option> <option value="OCT">October</option> <option value="NOV">November</option> <option value="DEC">December</option> </select>时,它们可以链接在一起而不重复接收器。 Martin Flower在这篇博客文章中推广了这个想法,但一直回到Smalltalk的self方法链接语法。

这实际上与类方法无关,并且对于实例方法的工作方式相同。这是一个将链从类传递到实例端的示例

;

答案 2 :(得分:1)

这些定义不可能;你在Tests课上定义了两个类方法。这相当于您的代码:

string = Tests.test1
# => string = "This is the First"
string.test2
# => (undefined method)

由于test2类未定义String,因此您会收到undefined method 'test2' for (...):String错误。

答案 3 :(得分:-1)

不太确定为什么要在这里链接方法调用,你可以单独调用它们。

{{1}}

错误的简短说明,第一种方法 test1 返回一个字符串,该字符串没有在其下定义的方法 test2 ,结果为

  

错误未定义方法`test2&#39; for&#34;这是第一个&#34;:String(NoMethodError)