2009-11-06 2 views
0

Функция принимает строку как аргумент, например fn ("string").Как написать блок, который возвращает строку в ruby ​​

Я хочу передать различные значения в зависимости от трех более условий, и один подход, который немного нечитаемым является:

fn(check_1 ? "yes" : check_2 ? "no" : "maybe") 

Я хочу, чтобы заменить аргумент с блоком, который возвращает строку. я надеюсь, что я могу сделать что-то вроде:

fn({|arg| if check_1 
    arg = "yes" 
    elsif check_2 
    arg = "no" 
    else 
    arg = "maybe" 
    end 
}) 

я могу иметь больше условий и будет по-прежнему иметь возможность писать все это, как если бы это было в одной строке.

Как это сделать в Ruby?

ответ

1

Это звучит немного странно. Вы уверены, что не хотите передавать массив и обрабатывать аргументы из метода?

В любом случае, это похоже на то, что вы просите, это лямбда для обработки логики, а затем вы можете передать лямбду в функцию, чтобы вернуть фактические результаты.

def test(parameter) 
    puts "I was passed the value: #{parameter}" 
end 

foo = lambda{|x,y,z| 
if x == true 
"yes" 
elsif y == true 
"no" 
else 
"maybe" 
end 
} 

test(foo[false,true,false]) 
+0

Я не уверен, как я его использую. Я имею в виду, если я делаю test (foo), я получаю вывод, как будто мне передано значение: # , тогда как я хочу, чтобы sth: мне было передано значение: true – umar

+0

lambda foo ожидает 3 входа. ему нужен вход для возврата результата. поэтому вы не можете пройти тест (foo), вам нужно пройти тест (foo ["something", true, false]) – cgr

1

Вы можете использовать выражение if или даже выражение case. См. the PickAxe book. Пример того, что вы хотите сделать, находится в верхней части страницы.

+0

это решает мою проблему, но я все равно хочу вложить, если условие в контейнере, который выглядит как блок, а не как Условное состояние .. у получить что Я имею в виду? – umar

3

Блок прохладно, но это не значит, что мы всегда должны использовать его.

IMHO. Было бы намного понятнее использовать отдельную функцию, чтобы получить строку, которую вы хотите передать, в fn.

def arg w 
    if w.eql? "check_1" 
      "yes" 
    elsif w.eql? "check_2" 
      "no" 
    else 
      "maybe" 
    end 
end 

def fn s 
    puts s 
end 

fn(arg("check_1")) 
fn(arg("check_2")) 
fn(arg("check_3")) 

Или использовать Hash, который остается вам в качестве упражнения :)

+0

Фактически, я использую модуль table_helper в rails и для столбца с именем t.status, чей код, который я не меняю, я должен указать значение изображения в зависимости от двух или трех атрибутов. поэтому я вынужден передавать ему строку, и я хочу сделать это в одной строке, а не писать функцию отдельно, поэтому я думал, что блок будет хорош здесь, потому что блок ppl знает как одна строка, даже если она распространяется более чем одного – umar

1

Кажется, у вас есть какие-то неправильные представления о блоках, но это другое дело entirelly.

Я думаю, что поможет вам:

check_1 = false 
check_2 = true 

def foo(&block) 
    puts block.call 
end 

foo { 
    if check_1 
    arg = "yes" 
    elsif check_2 
    arg = "no" 
    else 
    arg = "maybe" 
    end 
} 
Смежные вопросы