2017-08-25 26 views
-2

のは、私は次の文があるとしましょう:2三項演算子文をマージ

@string += @a == @b ? "X" : "Y" 
@counter += @a == @b ? 1 : -1 

は、1行に文をマージすることが可能ですか?

(。私はルビーで質問をタグ付けしましたが、私はまた、他の言語での三項演算子に興味を持って、私はcodegolfのためのいくつかのトリックを学びたい)

+1

は、私はあなたがこれらの言語のためのソリューションに興味があるなら、あなたはまた、PythonやPerlのような他の言語との質問にタグを付けることをお勧めしたい:

これは特殊なケースです。 – rubystallion

答えて

3

あなたがゴルフをしている場合は、これを使用することができます:

string<<?X&&1 

が、これは

のように見える広がっ:それは読むには少し難しいので、

counter+=a==b ?string<<?X&&1:string<<?Y&&-1 

説明のビット、?Xが文字literal表記で

string << ?X && 1 

:(?)

構文は疑問符である単一の文字列を、表現する文字リテラルの表記もあり、その単一の文字またはエスケープシーケンスが続きますスクリプトのエンコーディング

に単一のコードポイントに対応してまたちょうどここstring << 'X'を「通常」の文字列を使用することができますが、それは長い文字だし、ゴルフはすべてに約短いです。

<<は、文字列を連結するだけです。それはRubyが、それはTypeError: no implicit conversion of Integer into Stringをスロー

string += (?X && 1) 

だろうと考えてそう&&よりも優先順位が低いですので、あなたは、そこに+=を使用することはできません。

それでは、その行の残りの部分は1を返すだけブール&&演算子である:あなたが三成分の一部を入力した場合

'some string' && 1 # => 1 

ので、あなたは文字列とのために、次に「戻る」1を連結counter +=。三項の残りの半分は、等しくない値を持つ同じものです。

1

はのは、私は次の文があるとしましょう:

Nitpick:ものは文ではありません。彼らは表現です。 Rubyでは、すべてが式であり、ステートメントはありません。

@string += @a == @b ? "X" : "Y" 
@counter += @a == @b ? 1 : -1 

それが1行にステートメントをマージすることは可能ですか?

はい!Rubyでは、それが1行にすべてを書くために常に可能で、改行は決して必要ありません:

改行

をフォーマットする:

@string += @a == @b ? "X" : "Y"; @counter += @a == @b ? 1 : -1 

は3例は基本的にあります。単純に書式設定に改行を使用すると、削除することができます。

a + 
b 

# same as: 
a + b 


def foo(a, b) 
    a + b 
end 

# same as: 
def foo(a, b) a + b end 

式区切り記号としての改行

改行記号を式区切り記号として使用すると、別の式区切り記号で置き換えることができます。 ;:化合物式における発現セパレータとして

foo() 
bar() 

# same as: 
foo(); bar() 


def bar 
    'Hello' 
end 

# same as: 
def bar; 'Hello' end 

改行

これは、上記の特別な場合です。

if foo 
    bar 
else 
    baz 
end 

# same as: 
if foo then bar else baz end 
# or: 
if foo; bar else baz end 


case foo 
when bar 
    baz 
when qux 
    frob 
end 

# same as: 
case foo when bar then baz when qux then frob end 
# or: 
case foo when bar; baz when qux; frob end 


while foo 
    bar 
end 

# same as: 
while foo do bar end 
# or: 
while foo; bar end 

などなど:複合式では、表現の区切りとしてセミコロンに加えて、代わりに使用できるキーワードもあります。

def bar 
    'Hello' 
end 

# same as: 
def bar() 'Hello' end 
# the parentheses are needed to Ruby knows where the parameter list ends