Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby:在块中使用self?_Ruby - Fatal编程技术网

Ruby:在块中使用self?

Ruby:在块中使用self?,ruby,Ruby,简短问题:当调用对象“a”的方法并向其传递一个块时,我可以从该块中访问“a”吗 示例:假设我有一个数组“words”,我首先要从中删除所有“bad”单词(使用函数确定),然后在剩下的单词中找到最频繁的单词。我可以用两行代码来完成: temp_words = words.reject{|w| word_is_bad(w)} puts temp_words.max{|w| temp_words.count(w)} 但是,我希望避免创建一个名为“temp_words”的新变量,并在一行中完成所有操作

简短问题:当调用对象“a”的方法并向其传递一个块时,我可以从该块中访问“a”吗

示例:假设我有一个数组“words”,我首先要从中删除所有“bad”单词(使用函数确定),然后在剩下的单词中找到最频繁的单词。我可以用两行代码来完成:

temp_words = words.reject{|w| word_is_bad(w)}
puts temp_words.max{|w| temp_words.count(w)}
但是,我希望避免创建一个名为“temp_words”的新变量,并在一行中完成所有操作,如下所示:

words.reject{|w| word_is_bad(w)}.max{|w| self.count(w)}

尽管我相信我的意图是明确的,但代码失败了,因为“self”不是指调用reject后生成的临时数组,而是指程序的主对象。

如果您想坚持自己的方式,可以编写:

words.reject{|w| word_is_bad(w)}.instance_eval{max_by{|w| count(w)}}
但更好、更受欢迎的方法是:

words.reject{|w| word_is_bad(w)}.group_by{|w| w}.max_by{|_, a| a.length}.first

如果你想坚持自己的做法,你可以写:

words.reject{|w| word_is_bad(w)}.instance_eval{max_by{|w| count(w)}}
但更好、更受欢迎的方法是:

words.reject{|w| word_is_bad(w)}.group_by{|w| w}.max_by{|_, a| a.length}.first

简而言之,答案是否定的,除非使用instance_eval或类似的工具

不过,你真的不需要把积木锁起来。我可以这样写:

 words.max_by {|w| word_is_bad(w) ? -1 : words.count(w) }
(旁注,我想你可能想要马克斯而不是马克斯)

如果您发现自己必须巧妙地使用一行程序来表达您的逻辑,那么在类中封装所需内容可能是有意义的。考虑这个简单的例子:

class Words < Array
  def self.is_bad(word)
    foo
  end

  def good
    reject {|w| Word.is_bad(w) }
  end
end
更具表现力,回避问题

进一步:

def max_good
  good.max_by {|word| count(word) }
end

你可以写一些简单的单词。max\u good

简短的回答是否定的,除非使用实例评估或类似的方法

不过,你真的不需要把积木锁起来。我可以这样写:

 words.max_by {|w| word_is_bad(w) ? -1 : words.count(w) }
(旁注,我想你可能想要马克斯而不是马克斯)

如果您发现自己必须巧妙地使用一行程序来表达您的逻辑,那么在类中封装所需内容可能是有意义的。考虑这个简单的例子:

class Words < Array
  def self.is_bad(word)
    foo
  end

  def good
    reject {|w| Word.is_bad(w) }
  end
end
更具表现力,回避问题

进一步:

def max_good
  good.max_by {|word| count(word) }
end

你可以写一些简单的单词。max_good

简短的回答是否定的,除非使用实例评估或类似的方法。不过,你真的不需要把积木锁起来。你可以把它写成
words.max_by{w | word_是坏的(w)?-1:words.count(w)}
(旁注,我想你可能想要max_by而不是max)@numbers131407这将是一个很好的答案,为什么不把它作为一个来添加呢?@MarkThomas good point,will dot这个简短的答案是否定的,不是没有使用实例eval或类似的东西。不过,你真的不需要把积木锁起来。你可以像写单词那样写。max_by{w | word_is_bad(w)?-1:words.count(w)}(旁注,我想你可能想要max_by而不是max)@numbers131407这将是一个很好的答案,为什么不把它作为一个来添加呢?@MarkThomas good point,will dot这是一个很好的解决方案,但仅用于示例。在我的“真实”问题中,我正在处理的临时数组是一个复杂得多的过程的结果。当所有单词都是坏单词时,这段代码以静默方式返回第一个单词,而不告诉它是坏的。您可能希望扩展
数组
,或者编写一个自定义的可枚举
单词
类来封装所需的逻辑。@sawa这是真的,所以如果这是一个单行程序,那么拒绝第一个单词会更有意义。鉴于OP已经承认“真正的”问题更为复杂,所以将复杂的一行程序放在一起,并将逻辑封装在一个类中可能是有意义的。这是一个很好的解决方案,但仅限于示例。在我的“真实”问题中,我正在处理的临时数组是一个复杂得多的过程的结果。当所有单词都是坏单词时,这段代码以静默方式返回第一个单词,而不告诉它是坏的。您可能希望扩展
数组
,或者编写一个自定义的可枚举
单词
类来封装所需的逻辑。@sawa这是真的,所以如果这是一个单行程序,那么拒绝第一个单词会更有意义。鉴于OP已经承认“真正的”问题更为复杂,所以将复杂的一行程序放在一起并将逻辑封装在一个类中可能是有意义的。