【问题标题】:if statements that also use .include? and && in rubyif 语句也使用 .include?和 && 在红宝石中
【发布时间】:2014-12-05 18:30:25
【问题描述】:

我是 Ruby 的新手,正在尝试创建一个类似 Zork 的小型游戏。我遇到以下代码行的问题:

puts "Do an action"
action = gets.chomp

if action.include? 'look' && 'bed'
puts "you look at the bed"
elsif action.include? 'pickup' && 'bed'
puts "you pickup the bed"
else
puts "you do nothing"
end

出于某种原因,当我第一次在新文件中单独键入它时,它会起作用。如果我无论如何更改代码,它只会给我第一次放置。

【问题讨论】:

  • 你能详细说明什么是/不工作吗?添加输入、预期行为和实际行为会很有帮助。
  • 如果你需要检查数组中多个值的成员关系,你需要单独写成action.include?('look') && action.include?('bed')或更聪明的['look', 'bed'].all? {|o| action.include? o}或更邪恶的['look', 'bed'].all? &action.method(:include?)

标签: ruby if-statement operators


【解决方案1】:

你可以用猴子补丁String 来做这样的事情

class String
  def include_all?(*args)
    args.map{|arg| self.include?(arg)}.reduce(:&)
  end
end

然后像这样调用

action = "look a dog bed for sale"
action.include_all?("look","bed")
#=> true
action.include_all?("look","bed","fish")
#=> false

这样做的目的是,它需要尽可能多的参数,并使用 splat * 将它们放入 Array,然后检查每个参数是否包含在 String 中。然后它使用 & 运算符将它们减少为单个值,因此它转换为

action = "look a dog bed for sale"
action.include_all?("look","bed")
  #args = ["look","bed"]
  #args.map{|arg| action.include?(arg)}
  #=> [true,true]
  #true & true
  #=> true
action.include_all?("look","bed", "fish")
  #args = ["look","bed","fish"]
  #args.map{|arg| action.include?(arg)}
  #=> [true,true,false]
  #true & true & false
  #=> false

其他建议是更标准的程序。我只是想向新的 ruby​​ 专家指出,改变一个类是一个相当简单的过程。使用风险自负

【讨论】:

  • 哎呀。只是ewww。我们不要向刚开始使用 ruby​​ 的人建议猴子修补。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
相关资源
最近更新 更多