2011-05-14 6 views
20

이 개념에 대한 권위있는 예제 나 토론을 찾는 데 어려움이 있습니다. 루비 메소드에 2 개의 변수가 있고 그 값을 0으로 초기화해야합니다. 그들은 카운터로 사용됩니다. 괜찮습니까, 안전한가요? 그것은 내 테스트에서 작동합니다. 대신이의두 줄 변수를 같은 줄에 초기화하십시오.

:

foo = 0 
bar = 0 

당신은이 작업을 수행 할 수 있습니까?

foo = bar = 0 

줄을 저장하고 표현력을 향상시키는 좋은 방법 인 것처럼 보입니다. 아니면 나쁜 행동입니까? 나는 약간의 가독성을 희생 할 것임을 알았다. 그러나 작은 루비 방법 (< 10 줄)에서는 유효하지 않을 수 있습니다.

답변

15

많은 언어에서 후자는 두 변수에 동일한 개체를 할당하므로 개체가 변경 가능하면 문제가 될 수 있습니다. 이 작업을 더 잘 수행하십시오.

foo, bar = 0, 0 
+0

일부 언어에서는 true이지만 Ruby에서는 관련성이 없습니다. IMO 완전히 괜찮아. – Phrogz

+0

@Phrogz,이 루비에서 잘 작동합니다. – jasonleonhard

+1

잘 작동하지만 권장하지는 않습니다. https://github.com/bbsosov/ruby-style-guide#parallel-assignment –

1

안전하며 작동합니다.

코딩 기준에 따라 이와 같은 것이 싫은지 아닌지에 따라 다릅니다.

시간이 지나면 리팩터링을 위해 사용하십시오.

25

값이 짧고 쉽게 따라갈 수있는 한 동일한 변수에서 두 변수를 초기화하는 것이 좋습니다. 배열 구문을 사용하여 두 개의 서로 다른 값을 할당 할 수도 있습니다.

foo = bar = 123 
foo #=> 123 
bar #=> 123 

foo, bar = 1, 2 
foo #=> 1 
bar #=> 2 
+1

고마워! 나는 foo, bar = 1, 2를 좋아한다. 나는 그 것을 생각하지 않았다. 그리고 그것은 여전히 ​​읽을 수 있습니다. – mrjabba

30

이 방법은 효과가 있지만 루비에서 불변 인 숫자에 대한 변수를 사용하고 있기 때문에 상황에 따라서 만 안전하다는 것을 알아야합니다. 예를 들어, 문자열로 같은 것을 시도한 경우 예상하지 못한 동작이 발생할 수 있습니다.

ruby-1.9.2-p180 :001 > foo = bar = "string" 
=> "string" 
ruby-1.9.2-p180 :002 > foo.upcase! 
=> "STRING" 
ruby-1.9.2-p180 :003 > bar 
=> "STRING" 
7

이상한 현상입니다.
a = b = "hello"

을하지만 WAIT : 나는 당신의 관심사는 다음 일을 생각,
a, b = 123, 456

그러나 :

이그나시오 바스케스 - 에이 브람스의 대답은 서로 다른 값으로 변수를 초기화 마찬가지입니다! 위 라인은 변수 ab에 대해 동일한 메모리 주소를 할당합니다. 즉,
a.object_idb.object_id이 동일합니다. 따라서 a의 변경 사항은 b에 유지됩니다.

나는 그것을 좋아하지 않지만, 해결 방법이 될 수 있습니다.
x = "a very long string or something you don't want to type multiple times"
a, b, c = x.clone, x.clone, x.clone

아 내가이 일을의 우아한 방법이 있었으면 좋겠어.

+0

나에게 꽤 우아 해 보입니다 ... –

관련 문제