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

时间:2011-11-23 18:53:48

标签: ruby

以下是我正在尝试做的一个例子:

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

难怪它不是在阅读频道。帮助

2 个答案:

答案 0 :(得分: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"]

答案 1 :(得分: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

你的ifs集合只是一种非常冗长的写作方式splitChannel.each