有没有一种方法在Ruby中使用整数作为方法名?

4

这是我要做的一个示例:

def 9()
  run_playback_command(NINE_COMMAND)
end

我希望这样做是因为后面会像这样使用它:
if(channelNumber != nil)
  splitChannel = "#{channelNumber}".split(//)
  if(splitChannel[3] != nil)
    response = "#{splitChannel[3]}"()
  end
  if(splitChannel[2] != nil)
    response = "#{splitChannel[2]}"()
  end
  if(splitChannel[1] != nil)
    response = "#{splitChannel[1]}"()
  end
  if(splitChannel[0] != nil)
    response = "#{splitChannel[0]}"()
  end
end

如果这个问题很简单,我很抱歉给您带来的麻烦!我在Ruby方面非常新手。

编辑:

以下是我想让Siri执行的操作:

if(phrase.match(/(switch to |go to )channel (.+)\s (on )?(the )?(directv|direct tv)( dvr| receiver)?/i))

  self.plugin_manager.block_rest_of_session_from_server
  response = nil

  if(phrase.match(/channel \s([0-9]+|zero|one|two|three|four|five|six|seven|eight|nine)/))        
    channelNumber = $1

    if(channelNumber.to_i == 0)
      channelNumber = map_siri_numbers_to_int(channelNumber)
    end

    channelNumber.to_s.each_char{ |c| run_playback_command(COMMAND[c]) }
  end

难怪它没有读取到频道。需要帮助吗?

1
我已经读了三遍,仍然不确定你想做什么。你不能将9定义为一个方法,请解释一下9与代码片段的相关性。 - Gazler
我正在尝试为SiriProxy制作一个DirecTV频道切换器。问题是,您必须逐个发送按钮按下到接收器。在底部的代码片段中,它将频道拆分并将数字发送到定义,然后运行命令。 - williammck
2个回答

7

这是您需要的吗?

COMMAND = {
  "0" => ZERO_COMMAND,
  "1" => ONE_COMMAND,
  "2" => TWO_COMMAND,
  #...
  "9" => NINE_COMMAND
}

channelNumber.to_s.each_char{ |c| run_playback_command(COMMAND[c]) }

你甚至不需要检查 nil? 因为 nil.to_s 是一个空字符串,因此 each_char 迭代器将不会处理任何字符。

顺便说一下,使用标准语法无法定义(或调用)不是合法标识符的方法名(不能以数字开头),但这在技术上是可能的:

class Foo
  define_method "9" do
    puts "It's nine!"
  end
end

f = Foo.new
c = "9"
f.send(c)
#=> "It's nine!"

p (f.methods - Object.methods)
#=> [:"9"]

4

这里有一个适当的解决方案:

callbacks = {"9" => lambda { run_playback_command(NINE_COMMAND) } }

if channelNumber
  splitChannel = channelNumber.to_s.split(//)
  splitChannel.each do |number|
    callbacks[number].call
  end
end

你的一系列条件语句只是在很冗长地编写 splitChannel.each

这会将所有数字都分开吗?如果 channelNumber 是 1231,我需要它发送一个命令为 1、2、3、1。 - williammck
实际上我的代码没有太多意义(find函数有问题),已经修复了。 - Dominik Honnef

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接