Ruby方法

时间:2017-01-25 05:11:55

标签: ruby methods

我很遗憾地提出这样一个基本问题,但我已经找到了解决方案,而且似乎找不到一个有意义的解决方案。

基本上,我正在尝试编写一个返回列表(字符串或数组)的最后一个值的Ruby方法。这是我的代码:

def last(x)
x[-1]
end

它实际上产生了我想要的结果,但是给了我以下错误:

`last': wrong number of arguments (given 5, expected 1) (ArgumentError)

我试过简单地将一个通配符添加到我期望的参数中,如下所示:

def last(*x)
x[-1]
end

这只输出所有值而不是最后一个值。任何人都有任何想法,我出错了?再次,抱歉基本问题。

4 个答案:

答案 0 :(得分:1)

调用方法时,需要将其传递给单个数组。我猜你正在传递几件物品。

>> last(1,2,3,4,5)
ArgumentError: wrong number of arguments (5 for 1)
>> last([1,2,3,4,5])
=> 5

答案 1 :(得分:0)

相关文档为here

“通配符”称为“splat operator”。

我希望这段代码更清晰:

def last_element_in_array(array) # <-- There must be exactly one parameter
  array[-1]
end

def last_parameter(*parameters) # <-- Any number of parameters
  parameters[-1]
end

p last_element_in_array([1, 2, 3, 4, 5])
#=> 5
p last_parameter(1, 2, 3, 4, 5)
#=> 5
p last_parameter
#=> nil
p last_parameter([1, 2, 3, 4, 5]) # <-- Only one parameter : an array with 5 elements
#=> [1, 2, 3, 4, 5]
p last_element_in_array(1, 2, 3, 4, 5) # <-- Too many parameters. There should be only 1, and it should be an Array.
#=> in `last_element_in_array': wrong number of arguments (given 5, expected 1) (ArgumentError)

答案 2 :(得分:0)

.last allready是一个像Array一样的集合方法。 但我想我看到了你想要的东西,它是Array和String的通用方法。 它需要能够接受不同数量的参数(args数组) 以及数组本身。

如果您研究下面的结果,您会发现各种版本出了什么问题 您必须将.last方法添加到String,但是您仍然遇到麻烦 传递数组时,请查看最后一个解决方案。 它首先展平任何数组并给出.last元素, 然后它查看最后一个元素的类,以防它是一个字符串 它[-1]返回最后一个字符,否则只返回数字 除了String或Array之外的不支持.last的参数仍会出错 我从我的编辑器运行它,而不是irb所以我在这里使用p进行一些简单的调试。 为什么p而不是put?因为它检查对象并在一行上打印数组。

[__LINE__]构造用于打印亚麻布以查看您看到的结果 我将它们留在原地,以便您可以尝试这种简单的调试技术。

你最好另外调用这个方法(例如last_of),以避免在某些类中使用.last方法造成混淆。

p [__LINE__,[1, 2, 3].last] # 3

def last(x)
  x[-1]
end

p [__LINE__,last([1, 2, 3])] # 3
#p last(1, 2, 3) # wrong number of arguments (3 for 1) (ArgumentError)
p [__LINE__, last("a string")] # g

def last(*x)
    p [__LINE__, x] 
  x[-1]
end

p [__LINE__, last([1, 2, 3])] # [1, 2, 3]
p [__LINE__, last(1, 2, 3)] # 3
p [__LINE__, last("a string")] # "a string"

def last *x
    e = x.flatten.last # flatten any Arrays 
    case e
      when String 
        e[-1]
      when Fixnum
        e
    end
end

p [__LINE__, last([1, 2, 3])] # 3
p [__LINE__, last(1, 2, 3)] # 3
p [__LINE__, last("a string")] # "g"
p [__LINE__, last(["a string"])] # "g"

答案 3 :(得分:0)

听起来你希望能够使用这两种不同的方式:

last(:a, :b, :c)
last(my_list_type)

实现这一目标的最简单方法是&#34; splat&#34;参数,然后检查你给出了多少元素。例如:

def last(*args)
  return args[-1] if args.length > 1
  return args[0][-1] if args.length == 1 && args[0].respond_to?(:length)
  args[0] # because we have been given nothing, or a single, non-list-type item
end

请注意以下用途 - 这可能会或可能不是您的意图,但应该为您提供一个良好的起点:

last 1,2,3          #=> 3
last [4,5,6]        #=> 6
last 1              #=> 1
last "1"            #=> "1"
last "123"          #=> "3"
last "123", "456"   #=> "456"
last                #=> nil
last []             #=> nil