国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Ruby元編程的一些值得注意的地方

2019-10-26 19:28:10
字體:
供稿:網(wǎng)友

  避免無限循環(huán)的元編程。

    寫一個(gè)函數(shù)庫(kù)時(shí)不要使核心類混亂(不要使用 monkey patch)。

    代碼塊形式最好用于字符串插值形式。
        當(dāng)你使用字符串插值形式,總是提供 __FILE__ 和 __LINE__,使得你的回溯有意義。

 class_eval 'def use_relative_model_naming?; true; end', __FILE__, __LINE__

        define_method 最好用 class_eval{ def ... }

    當(dāng)使用 class_eval (或者其他的 eval)以及字符串插值,添加一個(gè)注釋塊使之在插入的時(shí)候顯示(這是我從 rails 代碼學(xué)來的實(shí)踐):

 # from activesupport/lib/active_support/core_ext/string/output_safety.rb UNSAFE_STRING_METHODS.each do |unsafe_method|  if 'String'.respond_to?(unsafe_method)  class_eval <<-EOT, __FILE__, __LINE__ + 1   def #{unsafe_method}(*args, &block)  # def capitalize(*args, &block)   to_str.#{unsafe_method}(*args, &block) # to_str.capitalize(*args, &block)   end          # end   def #{unsafe_method}!(*args)    # def capitalize!(*args)   @dirty = true       # @dirty = true   super         # super   end          # end  EOT  end end

    避免在元編程中使用 method_missing,它使得回溯變得很麻煩,這個(gè)習(xí)慣不被列在 #methods,拼寫錯(cuò)誤的方法可能也在默默的工作,例如 nukes.launch_state = false。考慮使用委托,代理或者是 define_method ,如果必須這樣,使用 method_missing ,
        確保 也定義了 respond_to_missing?
        僅捕捉字首定義良好的方法,像是 find_by_* ― 讓你的代碼越肯定(assertive)越好。
        在語句的最后調(diào)用 super
        delegate 到確定的、非魔法方法中:

 # bad def method_missing?(meth, *args, &block)  if /^find_by_(?<prop>.*)/ =~ meth  # ... lots of code to do a find_by  else  super  end end # good def method_missing?(meth, *args, &block)  if /^find_by_(?<prop>.*)/ =~ meth  find_by(prop, *args, &block)  else  super  end end # best of all, though, would to define_method as each findable attribute is declared


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 五峰| 长乐市| 芮城县| 当涂县| 塔城市| 宁城县| 富阳市| 凤城市| 富民县| 斗六市| 永嘉县| 安福县| 潞西市| 铁力市| 福鼎市| 隆德县| 郎溪县| 新安县| 吉水县| 阿勒泰市| 通江县| 罗田县| 出国| 内乡县| 安西县| 曲沃县| 莲花县| 江陵县| 扶风县| 定西市| 岳阳县| 边坝县| 永定县| 丰原市| 西盟| 安化县| 洪江市| 河南省| 彰化市| 云南省| 于田县|