2016-11-08 54 views
1

所以我還在學習如何在Ruby中編寫代碼,並且遇到了一些我很好奇的新東西。我的老師剛開始教我們關於方法,我想知道你是否可以調用/創建一個基於if-else語句的方法。例如,如果您有一個程序要求用戶輸入某人的姓名,那麼您可以使用該輸入來決定使用哪種方法?Ruby調用一個基於elseif語句的方法

例如:

puts "Please enter name(Brian, Andy, Tod)" 
string = gets.to_i 
if string == "Brian" 
    def b(string) 
     puts "Hi Brian" 
    return b 

elsif string == "Andy" 
    def a(string) 
     puts "Hi Andy" 
    return a 

elsif string == "Tod" 
    def t(string) 
     puts "Hi Tod" 
    return t 
else 
    puts "Not a valid entry" 
end 

我知道,代碼可能不工作,我只是創造了它把我的頭闡明瞭我的意思的頂部,但實際上有一個辦法做到這一點?

+0

如果您想要定義臨時過程,請使用'lambda'或' - >'等價物。 – tadman

回答

1

呀,正常的方式做,這是從(ELSIF)有條件的定義方法事先然後調用他們:

當你說 a本身這就是等於說 a()
def b 
    puts "Hello brian" 
end 

def a 
    puts "Hello andy" 
end 

def t 
    puts "Hello tod" 
end 

puts "Please enter name(Brian, Andy, Tod)" 
string = gets.chomp 
if string == "Brian" 
    b 
elsif string == "Andy" 
    a 
elsif string == "Tod" 
    t 
else 
    puts "Not a valid entry" 
end 

- 調用該方法。你可以在技術上定義條件內的方法(在調用它們之前),但這不是很好的風格,很少做到。

的其他一些觀點 -

  1. 這些方法不使用string參數,這樣你可以刪除它,就像我做
  2. gets.to_i時說:「獲得輸入,並將其轉換爲整數」 - 不是你想在這裏做什麼。什麼你要找的是gets.chomp,從最終得到一個線路輸入和刪除\n換行符(所有gets輸入將在年底換行符)

注意這個條件鏈似乎是一個很好的候選人case,你可以重構puts到一個地方 -

def b 
    "Hello brian" 
end 

def a 
    "Hello andy" 
end 

def t 
    "Hello tod" 
end 

input = gets.chomp 
puts case input 
when "Brian" then b 
when "Andy" then a 
when "Tod" then t 
else "not a valid entry" 
end 

,或者你可以使用一個哈希結構,而不是方法

puts { 
    "Brian" => "Hello brian", 
    "Andy" => "Hello andy", 
    "Tod" => "Hello tod" 
}.fetch(gets.chomp, "Invalid input") 
+3

'then'通常是混亂的,因爲爲了清晰起見,最好在他們自己的行中突出結果。 – tadman

+0

哦,很酷。非常感謝! – yukimoda