【问题标题】:Calling #[] on a ruby method [closed]在 ruby​​ 方法上调用 #[] [关闭]
【发布时间】:2014-08-03 18:33:56
【问题描述】:

创建一个可以这样调用的方法

some_named_method(string_1, string_2, int_1, int_2)[Integer]

我刚刚了解到,如果像 some_named_method[80] 那样调用方法 - 该方法是 Proc / lambda(?仍然有点不确定,任何详细说明都会很棒)

准则是,参数是可选的,根据提供的测试,以两个为一组,但括号中的数字将始终存在。它用于创建一个Array,对其进行操作,取决于传入的params..所以->

some_named_method[Integer]# => [0..整数]

some_named_method('Hey', 'There')[Integer] # 一些基于字符串参数的操作 => [0..Integer]

some_named_method('Hey', 'There', 3, 5)[Integer]

如何以这种方式使 lambda 具有可选参数?

回答(我认为)

当以这种方式调用方法时,some_named_method(*args)[Integer],会发生两件事之一。任一方法返回一个数组,因此在该数组上调用#[],返回指定索引处的任何对象

该方法包含一个 proc / lambda,#[some_arguement] 中的任何内容都作为参数传递给该 proc / lambda

【问题讨论】:

  • 它被称为方法,它非常常见:def foo; 42 end; foo() #=> 42。不幸的是,函数和方法经常被某些人互换使用。
  • 不太确定您在问什么,但该方法可以是任何采用 splat 运算符并使用 [] 方法返回对象的方法,例如 def fizz_buzz_custom(*a) a end
  • f(x)[y]z = f(x); z[y] 相同,因此您的方法可以返回 respond_to? :[] 的任何内容。
  • @JamesGibsonWeber 你说得对,我不明白,因为我不清楚这个问题。
  • 所以foo() 必须返回一些对象,它有一个方法[]。例如数组。请注意,foo()[x]foo[x] 相同,如果 foo 没有使用 args

标签: ruby lambda proc


【解决方案1】:

如果我理解这个问题,您需要一个方法,该方法接受任意数量的参数,并返回一个对象,该对象将在使用 [] 方法时创建一个数字范围。

此方法接受任意数量的参数(使用* splat 运算符),然后返回一个可用于[] 的proc。

def some_named_function(*args)
  proc do |length|
    # Do something with the args?
    (0..length).to_a
  end
end

然后就可以这样使用了:

some_named_function[3] # => [0, 1, 2, 3]
some_named_function('optional', 'args')[1] # => [0, 1]

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多