2014-09-04 4 views
2

у меня есть это, если заявление:Дайте, если заявление переменной в Рубине

if value_n_in_f > 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x+#{value_n_in_f}" 
    elsif value_n_in_f == 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x" 
    elsif value_n_in_f < 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x#{value_n_in_f}" 
    elsif value_n_in_f > 0 && value_m_in_f == 1 
    puts "I: f(x)=x+#{value_n_in_f}" 
    elsif value_n_in_f == 0 && value_m_in_f == 1 
    puts "I: f(x)=x" 
    elsif value_n_in_f < 0 && value_m_in_f == 1 
    puts "I: f(x)=x#{value_n_in_f}" 
    end` 

Я должен использовать это заявление действительно часто в других заявлениях, и это делает мой код излишне долго. Очевидно, if_for_f = если ....... конец не будет работать. Есть ли другой путь? Вот пример того, что я хочу, чтобы это выглядело как:

puts "Now we insert #{value_of_x} in #{if_for_f}" 

Есть ли способ, что я могу сделать что-то вроде этого? Заметьте, что я совершенно новичок в этом.

Спасибо заранее, Kaiton

+1

Вы могли бы написать функцию с именем 'if_for_f', которая принимает в любых требуемых значений. – tadman

+1

Мне кажется, что (только) причина, по которой условия выглядят беспорядочными, - это потому, что имена переменных 'value_n_in_f' и' value_m_in_f' являются длинными и необычными. Если вы сделаете им одну букву, это сделает ее простой. Собственно, ваш вопрос непонятен. – sawa

+0

Просто хочу упомянуть, что ваше утверждение «Очевидно» на самом деле неверно. Вы можете присвоить результат оператора 'if' переменной. Не то, чтобы вы здесь, но это возможно - точно так же, как J-Dizzle присваивает переменную результат оператора case. –

ответ

4

не может я просто защиту функция с ним s для запуска этого случая заявление и называть его тогда, когда мне это нужно?

Конечно:

def do_stuff(m, n) 
    if m == 1 
    if n > 0  then "I: f(x)=x+#{n}" 
    elsif n == 0 then "I: f(x)=x" 
    elsif n < 0 then "I: f(x)=x#{n}" 
    end 
    else 
    if n > 0  then "I: f(x)=#{m}x+#{n}" 
    elsif n == 0 then "I: f(x)=#{m}x" 
    elsif n < 0 then "I: f(x)=#{m}x#{n}" 
    end 
    end 
end 

puts do_stuff(1, 1) #I: f(x)=x+1 

Или, если Компактность цель, мы можем получить это:

def do_stuff(m, n) 
    if m == 1 
    n == 0 ? "I: f(x)=x"  : "I: f(x)=x#{sprintf("%+d", n)}" 
    else 
    n == 0 ? "I: f(x)=#{m}x" : "I: f(x)=#{m}x#{sprintf("%+d", n)}" 
    end 
end 

... а затем один лайнер:

def do_stuff(m, n) 
    (m == 1) ? (n == 0 ? "I: f(x)=x" : "I: f(x)=x#{sprintf("%+d", n)}") : (n == 0 ? "I: f(x)=#{m}x" : "I: f(x)=#{m}x#{sprintf("%+d", n)}") 
end 
end 

Но у вашей методологии есть некоторые проблемы с нулями и -1:

def do_stuff(value_m_in_f, value_n_in_f) 
if value_n_in_f > 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x+#{value_n_in_f}" 
    elsif value_n_in_f == 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x" 
    elsif value_n_in_f < 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x#{value_n_in_f}" 
    elsif value_n_in_f > 0 && value_m_in_f == 1 
    puts "I: f(x)=x+#{value_n_in_f}" 
    elsif value_n_in_f == 0 && value_m_in_f == 1 
    puts "I: f(x)=x" 
    elsif value_n_in_f < 0 && value_m_in_f == 1 
    puts "I: f(x)=x#{value_n_in_f}" 
    end 
end 

do_stuff(1, 0) 
do_stuff(1,-1) 
do_stuff(1, 1) 
do_stuff(0,-1) 
do_stuff(0, 0) 
do_stuff(-1, 1) 

--output:-- 
I: f(x)=x 
I: f(x)=x-1 
I: f(x)=x+1 
I: f(x)=0x-1 #<---HERE 
I: f(x)=0x  #<---HERE 
I: f(x)=-1x+1 #<---HERE 

Итак, давайте поправим:

def get_line_equ(m, b) 
    constant = (b == 0) ? "" : sprintf("%+d", b) # 2 => "+2" 

    case m 
    when 0 
    xterm = "" 
    constant = b 
    when 1 
    xterm = "x" 
    when -1 
    xterm = "-x" 
    else 
    xterm = "#{m}x" 
    end 

    "I: f(x)=#{xterm}#{constant}" 
end 

puts get_line_equ(0, 0) 
puts get_line_equ(0, -1) 
puts get_line_equ(0, 1) 

puts get_line_equ(1, 0) 
puts get_line_equ(1,-1) 
puts get_line_equ(1, 1) 

puts get_line_equ(-1, 0) 
puts get_line_equ(-1, -1) 
puts get_line_equ(-1, 1) 

puts get_line_equ(2, 0) 
puts get_line_equ(2, -1) 
puts get_line_equ(2, 1) 

--output:-- 
I: f(x)=0 
I: f(x)=-1 
I: f(x)=1 
I: f(x)=x 
I: f(x)=x-1 
I: f(x)=x+1 
I: f(x)=-x 
I: f(x)=-x-1 
I: f(x)=-x+1 
I: f(x)=2x 
I: f(x)=2x-1 
I: f(x)=2x+1 

лучше?

спойлер:

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

В ответ на комментарий:

def my_sprintf(str, *numbers) 
    str.gsub(/% .*? [df]/x) do |match| #Looks for %...d or %...f sequences 
    puts match 
    end 
end 

my_sprintf("The answer is: %+d or %+d", -2, 3) 


--output:-- 
%+d 
%+d 

Далее:

def my_sprintf(str, *numbers) 

    str.gsub(/% .*? [df]/x) do |format_sequ| 
    number_as_str = numbers.shift.to_s 
    p number_as_str 

    if format_sequ[1] == "+" and number_as_str[0] != "-" 
     "+#{number_as_str}" 
    else 
     number_as_str 
    end 

    end 
end 

puts my_sprintf("The answer is: %+d or %+d.", -2, 3) 

--output:-- 
"-2" 
"3" 
The answer is: -2 or +3. 
+0

Спасибо, но что такое sprintf? – Kaiton

+0

Хорошо, я думаю, я понял sprintf сейчас. У меня проблема, но я хочу фракции, но когда я вызываю sprintf {"% + f", 1.5}, я получаю => 1.50000000, как я могу заставить его действовать как обычная дробь, только отображая цифры, которые я ему даю? А во-вторых. Может кто-нибудь объяснить, почему плюс в «% + d» не появляется при предоставлении отрицания n? Я имею в виду, что это очень полезно, но я не понимаю, почему это так. – Kaiton

+0

@ Kaiton, ** Может кто-нибудь объяснить, почему плюс в «% + d» не появляется при предоставлении отрицательного n? ** sprintf() - это метод, и как таковой он может быть запрограммирован на то, чтобы делать что угодно хочет. И так оно и было запрограммировано на работу. Или вы не можете понять, как компьютерная программа может сделать одно в одной ситуации, а другое - в другой ситуации? См. Нижнюю часть моего ответа для простой реализации sprintf(). – 7stud

2

Пару вещей здесь: вы можете поставить «путы», прежде всего, если/ELSIF блок и избежать того, ставит на каждой строке, например:

puts case 
    when (value_n_in_f > 0 && value_m_in_f != 1) then "I: f(x)=#{value_m_in_f}x+#{value_n_in_f}" 
    when (value_n_in_f == 0 && value_m_in_f != 1) then "I: f(x)=#{value_m_in_f}x" 
end 

Во-вторых, дело заявление будет гораздо более удобным для чтения, например, так:

def big_compare(value_n_in_f, value_m_in_f) 
    msg = case 
    when (value_n_in_f > 0 && value_m_in_f != 1) then "I: f(x)=#{value_m_in_f}x+#{value_n_in_f}" 
    when (value_n_in_f == 0 && value_m_in_f != 1) then "I: f(x)=#{value_m_in_f}x" 
    when (value_n_in_f < 0 && value_m_in_f != 1) then "I: f(x)=#{value_m_in_f}x#{value_n_in_f}" 
    when (value_n_in_f > 0 && value_m_in_f == 1) then "I: f(x)=x+#{value_n_in_f}" 
    when (value_n_in_f == 0 && value_m_in_f == 1) then "I: f(x)=x" 
    when (value_n_in_f < 0 && value_m_in_f == 1) then "I: f(x)=x#{value_n_in_f}" 
    end 
end 
puts big_compare(0, 0) 
+0

Я вижу, это очень полезно. Спасибо. Таким образом, это означает, что нет возможности присвоить переменную case/if переменной, как вы это делаете с помощью функции? я не могу просто определить функцию с ее функцией, чтобы запустить этот оператор case и вызвать его тогда, когда мне это нужно? – Kaiton

4

Вот более компактный способ написать заявление случай. Напомним, что a <=> b => -1 if a < b, a <=> b => 0 if a == b и a <=> b => -1 if a > b.

"I: f(x)=" + 
case [value_n_in_f <=> 0, value_m_in_f == 1] 
when [ 1,false] then "#{value_m_in_f}x+#{value_n_in_f}" 
when [ 0,false] then "#{value_m_in_f}x" 
when [-1,false] then "#{value_m_in_f}x#{value_n_in_f}" 
when [ 1,true] then "x+#{value_n_in_f}" 
when [ 0,true] then "x" 
when [-1,true] then "x#{value_n_in_f}" 
end 

Если вы хотите, чтобы продемонстрировать, как строится строка, вы могли бы сделать что-то вроде этого (с value_n_in_f и value_m_in_f переименованы intercept и slope, соответственно):

"I: f(x)=" + 
case 
when slope.zero? 
    intercept.zero? ? "0" : "#{intercept}" 
else 
    case slope.to_f 
    when 1.0 then "" 
    when -1.0 then "-" 
    else "#{slope}" 
    end + "x" + 
    case intercept <=> 0 
    when 0 then "" 
    when -1 then "#{intercept}" 
    else "+#{intercept}"  
    end 
end 

Обратите внимание, что это позволяет slope < 0, который не является частью спецификации. Я испытал это для различных комбинаций intercept и slope:

intercept slope string 
     -2.1 4  I: f(x)=4x-2.1 
     -2.1 -2.2 I: f(x)=-2.2x-2.1 
     -2.1 0  I: f(x)=-2.1 
     -2.1 0.0 I: f(x)=-2.1 
     -2.1 -1  I: f(x)=-x-2.1 
     -2.1 1.0 I: f(x)=x-2.1 
     0  4  I: f(x)=4x 
     0  -2.2 I: f(x)=-2.2x 
     0  0  I: f(x)=0 
     0  0.0 I: f(x)=0 
     0  -1  I: f(x)=-x 
     0  1.0 I: f(x)=x 
     0.0 4  I: f(x)=4x 
     0.0 -2.2 I: f(x)=-2.2x 
     0.0 0  I: f(x)=0 
     0.0 0.0 I: f(x)=0 
     0.0 -1  I: f(x)=-x 
     0.0 1.0 I: f(x)=x 
     3  4  I: f(x)=4x+3 
     3  -2.2 I: f(x)=-2.2x+3 
     3  0  I: f(x)=3 
     3  0.0 I: f(x)=3 
     3  -1  I: f(x)=-x+3 
     3  1.0 I: f(x)=x+3 
Смежные вопросы