Project1

标题: def的问题 [打印本页]

作者: b200077    时间: 2020-5-8 22:05
标题: def的问题
本帖最后由 b200077 于 2020-5-8 22:06 编辑

有没有办法使用输入值当做方法去引用呢?引用的类会分别使用不同名子的方法,主要如下,或者有没有更简单的写法
RUBY 代码复制
  1. def equips_effict(ability)
  2.          n = {}
  3.      case ability
  4.      when "death"
  5.        #獲取敵方死亡發動的能力
  6.      equip_slots.size.times do |i|           
  7.       if @equips[i] != nil   
  8.        value = @equips[i].death
  9.        if n.has_key?(value[0])
  10.        n[value[0]] += value[1]
  11.      else
  12.        n[value[0]] = value[1]
  13.      end
  14.    end
  15.     add_ability(n)
  16.      end
  17.           when "install_cost"
  18.        #獲取敵方死亡發動的能力
  19.  
  20.      equip_slots.size.times do |i|   
  21.        if @equips[i] != nil
  22.  
  23.        value = @equips[i].install_cost
  24.          puts "value為#{value}"
  25.          if value != nil
  26.        if n.has_key?(value[0])
  27.        n[value[0]] += value[1]
  28.      else
  29.        n[value[0]] = value[1]
  30.      end
  31.      end
  32.      end
  33.      puts "install_cost為#{n}"
  34.       add_ability(n)
  35.      end
  36.                when "atk_settle"
  37.        #獲取敵方死亡發動的能力
  38.      equip_slots.size.times do |i|
  39.        if @equips[i] != nil
  40.        value = @equips[i].atk_settle
  41.         if value != nil
  42.        if n.has_key?(value[0])
  43.        n[value[0]] += value[1]
  44.      else
  45.        n[value[0]] = value[1]
  46.      end
  47.      end
  48.      end
  49.      end
  50.      puts "atk_settle為#{n}"
  51.         #增加能力
  52.         add_ability(n)
  53.       end
  54.       end

这三个判断只差在@equips.方法名上,能不能写成一个就好
作者: PLeaseS    时间: 2020-5-8 22:51
更简单的写法吗

我建议用一堆分号
能节省不少行数
(手动滑稽)
作者: KB.Driver    时间: 2020-5-9 00:30
RUBY 代码复制
  1. def equips_effict(ability)
  2.   n = {}
  3.   equip_slots.each do |e|
  4.     next unless e
  5.     value = e.__send__(ability)
  6.     n[value[0]] = (n[value[0]] || 0) + value[1]
  7.   end
  8.   add_ability(n)
  9. end


用__send__来调用
第一个参数是方法名,后面的参数是要执行方法的参数列表
它还有一些其他变形,如果需要用到再自己去了解。

另外,不知道你原来写是什么,建议认真学习脚本,
尽量不要再写这种既为难自己又为难别人的坏代码。

作者: b200077    时间: 2020-5-10 16:31
KB.Driver 发表于 2020-5-9 00:30
def equips_effict(ability)
  n = {}
  equip_slots.each do |e|

传递之后,匹配不到怎么办
  1.    def ability(args)
  2.         if @note =~ /<#{args} = (\w+),(\d+)>/i  
  3.      return [$1,$2.to_f]
  4.     end
  5.   end
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1