2010-02-03 10 views
15

To pytanie jest podobne do WIELU pytań, ale w żaden sposób nie jest to nic z duplikatu. To pytanie dotyczy konkatenacji ciągów i pisania lepszego kodu mniej niż w przypadku sprawdzania zer/zero.Sprawdzanie ciągu zerowego przed konkatenacją

Obecnie mam:

file.puts "cn: " + (var1.nil? ? "UNKNOWN" : var1) 

który działa dobrze, ale nie wygląda dobrze. Jaki jest lepszy sposób, aby napisać to w ruby ​​tak, że jestem sprawdzanie zera i nie łącząc go

Odpowiedz

40

Można to zrobić:

file.puts "cn: " + (var1 || "UNKNOWN") 

lub identycznie, jeśli wolisz:

file.puts "cn: " + (var1 or "UNKNOWN") 

lub moim ulubionym, co moim zdaniem jest najbardziej idiomatyczne rubin:

file.puts "cn: #{var1 or 'unknown'}" 
+7

Jeśli zmienna 1 ma wartość "fałsz", zamiast niej pojawi się "nieznany". –

1
file.puts("cn:" + (var1 || "UNKNOWN")) 
4

zrobiłbym co Piotr zasugerował, zakładając, że false nie była poprawna wartość dla var1 i var1 był gwarancją nil lub ciąg. Można także wyodrębnić tę logikę do funkcji:

def display_value(var) 
    (var || "UNKNOWN").to_s # or (var.nil? ? "UNKNOWN" : var.to_s) if 'false' is a valid value 
end 

file.puts "cn: " + display_value(var1) 

to_s jest konieczne tylko w przypadku var1 nie gwarantuje się zero lub ciąg. Ewentualnie, jeśli zrobić:

file.puts "cn: #{display_value(var1)}" 

to zrobi niejawny to_s na skutek display_value

1

Ponieważ "cn: " część jest czysto estetyczny, a więc (? Więcej) ulec zmianie, aby spełnić przyszłe wytyczne prezentacja, Polecam używanie join;

file.puts(["cn", (var1 || "UNKNOWN")].join(": ") 

Być może w funkcji, jak wspomniano wcześniej - semantyki są takie same, zmieniły się tylko nazwy metod/słowa kluczowe;

def value_or_unknown(value, attribute = nil) 
    [attribute, (value or "UNKNOWN")] * ": " 
end 
4

użytkowania join dodać struny, które mogą być nil.

join nie będzie narzekać, jeśli istnieje nil

Na przykład:

["a","b",nil,"c"].join("") 

Wrócimy

abc 
+0

Dzieje się tak tylko przy dołączaniu pustego ["a", "b", zera, "c"]. Join ("_") => "a_b__c" (zauważ podwójny znak podkreślenia po "b") – pseudo

+0

@ pseudo '[" a "," b ", zero," c "]. compact.join (" _ ")' rozwiązuje problem – Viktor

0

użyciu Ruby 2.4.1, to_s rozwiązuje zarówno nil i "Hello" . Tak więc wystarczy var1.to_s.

2.4.1 :058 > nil.to_s 
=> "" 
2.4.1 :059 > "hello".to_s 
=> "hello" 
Powiązane problemy