I think that the following is what you want to get the desired deferred evaluation.

    SPECIAL_FIELDS = [
        [:$query,          :selector],
        [:$readPreference, :read_pref],
        [:$orderby,        :sort],
        [:$hint,           :hint],
        [:$comment,        :comment],
        [:$snapshot,       :snapshot],
        [:$maxScan,        :max_scan],
        [:$showDiskLoc,    :show_disk_loc]
    ]

    def special_selector
      SPECIAL_FIELDS.reduce({}) do |hash, pair|
        key, method = pair
        value = send(method)
        hash[key] = value if value
        hash
      end
    end