2012-04-12 60 views
3

比方说,我有一个具有以下的方法...检查方法中的每个参数?

def is_number?(a,b,c,d) 
    # ... check if the argument is a number 
end 

是否有可能通过传递到is_number?每个参数迭代和做什么方法内?

例如...

is_number?(1,3,"hello",5) 

会去通过每个参数,如果该参数的每个参数是一个数字,将返回true,但在这种情况下,它会因"hello"返回false。

我已经知道如何检查一个输入是否是一个数字,我只是希望能够在一个方法中检查所有参数。

回答

3
def is_number? *args; args.all?{|a| a.kind_of?(Fixnum)} end 

如果您想要不同的类匹配,请替换Fixnum

+0

谢谢!很棒。 – user1015523 2012-04-12 03:17:37

+2

我真的不明白为什么你坚持要将整个方法定义为一行,这是可怕的难以理解的,没有理由这么做。 – 2012-04-12 04:46:44

+0

@AndrewMarshall虽然我更喜欢它在一条线上,但并不那么重要。更重要的一点是,圆括号,花括号或括号内不应有空格。我的理解是只有程序员(不知道正确的拼写)会这样做。一些程序员也在标点符号之前放置空格。正确理解英语标点符号的人不会那样做。我不得不恢复它,因为我不想看起来没有受过教育。最后,许多流行的Ruby源代码,例如,Ruby on Rails使用了很多一行内容。 – sawa 2012-04-12 05:03:14

3

代码高尔夫泽的回答是:相同的长度,但避免了|

def is_number?(*args) 
    (args - args.grep(Fixnum)).empty? 
end 

is_number?(1,2,3) # => true 
is_number?(5,2,"foo") # => false 

这会是很好,如果有一个的grep -v,但目前there isn't one

+0

哇,对类常量使用'grep'是完全出乎意料的,但是另一个疯狂的(真棒)使用'==='。 – 2012-04-12 05:27:23