루비 배열이 있다고 가정 해 봅시다.
a = [1, 2, 3, 4]
첫 번째 항목을 제외한 모든 것을 원하면 쓸 수 있습니다 a.drop(1)
. 그래도 마지막 항목을 제외한 모든 것을 원한다면 이 방법 만 생각할 수 있습니다
a[0..-2] # or
a[0...-1]
그러나 이것들 중 어느 것도 사용하는 것만 큼 깨끗한 것처럼 보이지 않습니다 drop
. 내가 놓친 다른 내장 방법은 무엇입니까?
루비 배열이 있다고 가정 해 봅시다.
a = [1, 2, 3, 4]
첫 번째 항목을 제외한 모든 것을 원하면 쓸 수 있습니다 a.drop(1)
. 그래도 마지막 항목을 제외한 모든 것을 원한다면 이 방법 만 생각할 수 있습니다
a[0..-2] # or
a[0...-1]
그러나 이것들 중 어느 것도 사용하는 것만 큼 깨끗한 것처럼 보이지 않습니다 drop
. 내가 놓친 다른 내장 방법은 무엇입니까?
답변:
혹시...
a = t # => [1, 2, 3, 4]
a.first a.size - 1 # => [1, 2, 3]
또는
a.take 3
또는
a.first 3
또는
a.pop
마지막을 반환하고 배열 앞에 모든 것을 남겨 둡니다.
또는 저녁 식사를 위해 컴퓨터를 작동 시키십시오 .
a.reverse.drop(1).reverse
또는
class Array
def clip n=1
take size - n
end
end
a # => [1, 2, 3, 4]
a.clip # => [1, 2, 3]
a = a + a # => [1, 2, 3, 4, 1, 2, 3, 4]
a.clip 2 # => [1, 2, 3, 4, 1, 2]
Array
나에게 가장 좋은 방법 인 것처럼 방법을 추가 하십시오. 대부분의 프로젝트 core_ext.rb
는 이와 같은 확장자가 거의없는 파일로 끝납니다 . 일부 라이브러리는 실제로 다음 과 같은 모든 확장 ActiveSupport
입니다.
clip
누군가이 방법을 Ruby 커뮤니티에 어떻게 제출 합니까? 나는 이것이 실제로 거기에 있어야한다고 생각하며 원숭이 패치는 잘못된 것 입니다.
a.reverse.drop(1).reverse
전략을 좋아한다 . ;-)
호기심에서, 당신은 왜 안 좋아 a[0...-1]
합니까? 배열 조각을 얻으려고하므로 조각 연산자는 관용적 인 선택처럼 보입니다.
그러나 이것을 모든 곳에서 호출 해야하는 경우 DigitalRoss가 제안한 것처럼 항상 더 친숙한 이름의 메소드를 Array 클래스에 추가 할 수 있습니다. 아마도 이것처럼 :
class Array
def drop_last
self[0...-1]
end
end
drop_last
.
입니까?
nil
: [][1..-1]
-> nil
, [][0...-1]
->[]
또 다른 멋진 트릭
>> *a, b = [1,2,3]
=> [1, 2, 3]
>> a
=> [1, 2]
>> b
=> 3
a, *b = [1,2,3]
우리가 클래식 자동차 / CDR 방식으로 배열을 살펴 보자 것입니다.
pop()
배열 에서 작업 을 수행 하려고하지만 (마지막 항목이 삭제되는 경우) 팝 된 요소 대신 배열을 얻는 데 관심이 있다면 다음을 사용할 수 있습니다 tap(&:pop)
.
> arr = [1, 2, 3, 4, 5]
> arr.pop
=> 5
> arr
=> [1, 2, 3, 4]
> arr.tap(&:pop)
=> [1, 2, 3]
a[0...-1]
가장 좋은 방법 같습니다. 배열 슬라이싱 구문은 정확히이 목적으로 만들어졌습니다 ...
또는 배열을 수정하는 것이 마음에 들지 않으면 a.pop
다음을 호출하면됩니다 .
>> a = [1, 2, 3, 4]
>> a.pop
>> a
=> [1, 2, 3]
b = a.pop
한 줄에서 마지막 요소를 제거하고 나머지는 반환합니다.
[1, 2, 4, 5, 6].reverse.drop(1).reverse
심각하게 생각,
[1,2,3,4][0..-2]
#=> [1,2,3]
이게 방법이야:
[1,2,3,4,5][0..-1-1]
그러나 이것이 어떻게 작동하는지 설명합시다.
a = [1,2,3,4,5]
다음 예제는 0 위치에서 마지막 위치까지 모든 레코드를 반환합니다.
a[0..-1]
=> [1, 2, 3, 4, 5]
다음 예제는 1 위치에서 마지막 레코드 를 반환합니다.
a[1..-1]
=> [2, 3, 4, 5]
그리고 여기에 필요한 것이 있습니다. 다음 예제는 0 위치에서 last-1 로 레코드 를 반환합니다.
a[0..-1-1]
=> [1, 2, 3, 4]
-2
대신 쓸 수 있습니다 -1-1
.
답변 : a.τwτ
, 그러나 Pyper를 먼저 설치해야합니다 ...
Pyper는 소개 : 마 당신은 Lisp 다운을 알고 car
및 cdr
배열의 "처음"과 "휴식"을 반환? 귀하와 같은 요구에 부응하기 위해이 Lispy 메커니즘을 확장했습니다. 이라고 pyper
하고 2nd, 3rd, 3d, 3d에서 쉬고 마지막 등을 제외한 모든 것에 액세스 할 수 있습니다. caar
, cadr
, cdadar
등 리스프 공지 :
# First, gem install pyper
require 'pyper'
include Pyper
a = %w/lorem ipsum dolor sit amet/
# To avoid confusion with other methods, and also because it resembles a rain gutter,
# Greek letter τ is used to delimit Pyper methods:
a.τaτ #=> "lorem"
a.τdτ #=> ["ipsum", "dolor", "sit", "amet"]
a.τbτ #=> "ipsum"
a.τeτ #=> ["dolor", "sit", "amet"]
a.τcτ #=> "dolor" (3rd)
a.τzτ #=> "amet" (last)
a.τyτ #=> "sit" (2nd from the end)
a.τxτ #=> "dolor" (3rd from the end)
마지막으로 귀하의 질문에 대한 답변 :
a.τwτ #=> ["lorem", "ipsum", "dolor", "sit"] (all except last)
더 있습니다 :
a.τuτ #=> ["lorem", "ipsum", "dolor"] (all except last 2)
a.τ1τ #=> ["lorem", "ipsum"] (first 2)
a.τ8τ #=> (last 2)
a.τ7τ #=> (last 3)
구성 :
a.τwydτ #=> "olor" (all except 1st letter of the last word of all-except-last array)
이 단지보다 더 많은 명령 문자도 있습니다 a..f
, u..z
그리고 0..9
특히, m
지도를 의미합니다 :
a.τwmbτ #=> ["o", "p", "o", "i"] (second letters of all-except-last array)
그러나 다른 명령 문자는 너무 뜨겁고 현재 사용하기가 쉽지 않습니다.
이것은 원본의 마지막 요소를 제외한 새로운 배열을 만듭니다.
ary2 = ary.dup
ary2.pop
다른 사람들은 #pop을 사용하도록 제안했습니다. 배열을 제자리에서 수정해도 괜찮습니다. 그래도 문제가 없다면이 예제와 같이 먼저 배열을 dup하십시오.
나는 종종 배열의 마지막 n 요소를 제외한 모든 것을 원한다는 것을 알게되었습니다. 다른 솔루션보다 더 읽기 쉬운 방식 으로이 기능을 수행했습니다.
class Array
def all_but_the_last(n)
self.first(self.size - n)
end
end
이제 다음을 수행 할 수 있습니다.
arr = ["One", "Two", "Three", "Four", "Five"]
# => ["One", "Two", "Three", "Four", "Five"]
arr.all_but_the_last(1)
# => ["One", "Two", "Three", "Four"]
arr.all_but_the_last(3)
# => ["One", "Two"]
arr.all_but_the_last(5)
# => []
arr.all_but_the_last(6)
# ArgumentError: negative array size
호출자가이 메소드를 사용하는 방법을 책임 지도록 ArgumentError를 의도적으로 허용했습니다. 이 접근법에 대한 의견 / 비평을 듣고 싶습니다.