Ruby:如何确定方法调用方分配了多少变量

Ruby:如何确定方法调用方分配了多少变量,ruby,Ruby,我想让我的方法根据调用者分配的变量数量改变它返回的内容。有没有办法在方法中查询这一点?或者是否有一种方法可以对2值返回进行编码,以便在未提供分配目标时忽略第二个值?谢谢--迈尔斯 def foo 如果 返回[:bar,:baz] 其他的 返回:酒吧 结束 结束 x、 y=foo #我希望x得到:bar,而不是[:bar,:baz] x=foo 我认为这是不可能的。调用x时,y=foo然后首先计算foo,因此在赋值完成之前运行并返回。此外,我认为没有一种简单合理的方法可以让一个方法知道调用它的地方

我想让我的方法根据调用者分配的变量数量改变它返回的内容。有没有办法在方法中查询这一点?或者是否有一种方法可以对2值返回进行编码,以便在未提供分配目标时忽略第二个值?谢谢--迈尔斯

def foo
如果
返回[:bar,:baz]
其他的
返回:酒吧
结束
结束
x、 y=foo
#我希望x得到:bar,而不是[:bar,:baz]
x=foo

我认为这是不可能的。调用
x时,y=foo
然后首先计算
foo
,因此在赋值完成之前运行并返回。此外,我认为没有一种简单合理的方法可以让一个方法知道调用它的地方的代码结构

为什么不在调用该方法的地方处理此问题:

def foo
  [:bar, :baz] 
end

x, y = foo
x = foo.first
如果确实需要,可以将响应
的对象返回到_ary
。在您的示例中,您甚至可以使用
to_ary
方法来修补
符号

但是…不,只是不

class Symbol
  def to_ary
    [:bar, :baz]
  end
end

def foo
  :bar
end

a = foo
a #=> :bar

b, c = foo
b #=> :bar
c #=> :baz
无论返回什么类型的对象,它都将违反单一责任原则,因为它既充当返回值应该充当的对象,又充当将自身拆分为两个返回值的代理


只是…不,说真的。否。

返回值发生的情况显然超出了方法的范围。你不应该试图发现那里发生了什么

显而易见的解决方案是在呼叫方方面解决问题,例如通过:

def foo
  [:bar, :baz]
end

x, = foo

# or more specific

x, _ = foo
您还可以将值提供给块,只需定义您感兴趣的块参数:

def foo
  yield :bar, :baz
end

foo do |x|
  p x: x
  # prints {:x=>:bar}
end

foo do |x, y|
  p x: x, y: y
  # prints {:x=>:bar, :y=>:baz}
end
如果条件很重要,可以检查块的:


也许您正在寻找
if local_variables.size==2…
。看见这似乎是一段奇怪的代码,上下文是我在多个脚本中使用的一小段实用程序代码。我希望对于不同的上下文,返回是不同的,不需要添加一个输入参数来控制输出的少量复杂性。问题其实更多的是试图学习更多关于神秘Ruby的细节,而不是试图解决手头的问题(有许多更简单、更明显的解决方案)。感谢所有这些答案,我学到了更多!还有一点是,我已经在很多地方使用了这段实用程序代码,我想添加2cd返回值,而不是影响我已经使用它的所有地方的功能。。。这让我很高兴:-)
def foo
  yield :bar, :baz
end

foo do |x|
  p x: x
  # prints {:x=>:bar}
end

foo do |x, y|
  p x: x, y: y
  # prints {:x=>:bar, :y=>:baz}
end
def foo(&block)
  if block.arity == 2
    yield :bar, :baz
  else
    yield :bar
  end
end